2010-05-20 125 views
39

我想實現我的iPad應用程序中的佈局具有uitable觀點,即滾動左右而不是上下:水平的UITableView

因此,而不是

行1個 行2 排3 (垂直滾動) 這將是: 第1行,2行,3行 (水平滾動)

我見過的UITableView設計只做垂直滾動這樣的變換也沒有達到預期的效果。有沒有一種標準的方式來利用像uitableview提供的數據源提供程序的優勢?
我基本上想做一些類似於ipad上的BBC News reader app所做的事情,以及可供選擇的故事列表。

感謝

回答

3

現在你必須使用的UIScrollView和集中滾動只到水平位置。至於你需要處理的數據你自己的出庫和優化。如果您不希望超過十幾個對象,那麼您可以跳過它,但是如果它們是數據密集型的,則嘗試實施類似於UITableView使用的數據源和加載。請注意,英國廣播公司新聞閱讀器應用程序還使用啓用分頁功能來滾動每個'頁面(4左右新聞圖標)'。

5

此問題已被answered by apple。通過蘋果滾動示例

演示如何實現兩個 不同風格的UIScrollViews。第一個卷軸包含多個 圖像,顯示如何使用多個數據塊 (在我們的情況下爲5個單獨的UIImageView)來佈置大型 內容。

這也適用於iPad。

+1

死的資源鏈接:( – ULazdins 2016-12-20 07:37:28

+0

該示例代碼是太舊,你仍然可以訪問HTTPS: //web-beta.archive.org/web/20100805074840/developer.apple.com:80/iphone/library/samplecode/Scrolling/Listings/ReadMe_txt.html – 2016-12-20 12:56:12

29

我已經發布了示例代碼,演示了使用變換實現水平滾動表視圖的一種方法。它被稱爲EasyTableView併爲垂直和水平滾動表視圖提供相同的界面。

+0

偉大的代碼! – 2012-02-09 17:57:53

+0

奇妙的代碼位,很好的一個! – 2013-01-05 17:11:09

23

這是我使用的方法:

1)爲實現你的UITableView的自己的子類,並覆蓋其initWithCoder:方法如下圖所示:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    assert([aDecoder isKindOfClass:[NSCoder class]]); 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 

     const CGFloat k90DegreesCounterClockwiseAngle = (CGFloat) -(90 * M_PI/180.0); 

     CGRect frame = self.frame; 
     self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesCounterClockwiseAngle); 
     self.frame = frame;  

    } 

    assert(self); 
    return self; 
} 

2)創建自己的UITableViewCell類,並覆蓋initWithCoder:再次:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    assert([aDecoder isKindOfClass:[NSCoder class]]); 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 

     const CGFloat k90DegreesClockwiseAngle = (CGFloat) (90 * M_PI/180.0); 

     self.transform = CGAffineTransformRotate(CGAffineTransformIdentity, k90DegreesClockwiseAngle); 
    } 

    assert(self); 
    return self; 
} 

3)現在,你可以創建IB一個UITableView元素,並將其類爲「MyHorizo​​ntalTableView」在身份檢查員。

4)在IB中創建您的UITableViewCell元素,並在身份檢查器中將其類設置爲「MyHorizo​​ntalTableViewCell」。

就是這樣。

如果您不想使用IB來實例化您的表格視圖或單元格,這也可以通過重寫其他初始化器來工作。

A sample project我圍繞這個概念構建的可以在GitHub中找到。

+3

不錯,但有一個問題....如果我嘗試在運行應用程序時調整表的大小,單元格將不會調整垂直。水平尺寸不是問題,因爲有heightForRow Methode來自代表...但沒有人與......並且在轉換之後autoresize不會工作:-( – Raegtime 2012-08-02 15:16:57

+0

我需要完成所有這4個步驟? – 2014-02-25 12:09:32

+0

@OmerObaid - 還有其他方法可以實現相同的結果。您理論上可以覆蓋其他初始化器。這只是一種方法。 – diegoreymendez 2014-02-26 15:02:33

7

如果您可以將您的應用限制爲僅限iOS 6及更高版本,則最好的方法是使用UICollectionView

如果您需要支持iOS 4/5,請嘗試UICollectionView的開源重新實現之一,例如。 PSTCollectionView

+0

你可以給我一些提示(鏈接或代碼)關於如何做到這一點。我想我必須玩'UICollectionViewLayout'。任何幫助讚賞。謝謝! – Colas 2014-05-28 10:41:02

+0

你是對的;你會使用單行格子布局。 – JosephH 2014-05-28 15:08:55

+0

如何創建單行網格佈局?到目前爲止,我使用一個技巧:我要求兩個元素之間有非常大的最小空間。 – Colas 2014-05-28 16:29:30

1

我寫了一個簡單的UIScrollView子類,喜歡的UITableView實現細胞的可重用性,該謨MMHorizontalListView在GitHub上,也有一個測試項目,所以你可以看到如何用一個例子使用它,它的工作原理也與老的iOS像4.x版本(可能更舊...)

0

有一個簡單的絕妙技巧,讓UITableView能夠完成垂直和水平滾動。

你可以在有和沒有自動佈局的情況下做到這一點 - 我會用自動佈局解釋它。

在你UITableView有一個寬度約束和沒有尾隨對齊約束。 將此寬度約束與IBOutlet綁定,並在您的控制器中將以下設置設置爲表視圖上的屬性。

let contentWidth = 1000 // you calculate that 
tableViewWidthConstraint.constant = contentWidth 
tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 

的實現代碼如下必須是全幅呈現在水平方向上的所有內容,以及我們與內容大小玩弄屏幕尺寸做的伎倆相比。

下面的下面的作品他們的位置,但你可以在生命週期嘗試在不同的步驟:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    tableViewWidthConstraint.constant = contentWidth 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 
} 

// and this is needed to support rotation: 
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { 
     coordinator.animate(alongsideTransition: { (UIViewControllerTransitionCoordinatorContext) -> Void in 
      self.tableView.contentSize.width = (contentWidth * 2) - UIScreen.main.bounds.size.width 
     }, completion: nil) 
    } 
    super.viewWillTransition(to: size, with: coordinator) 
}