2009-05-17 9 views
3

UiTableView不提供橫向模式下的水平滾動。正確旋轉UITableView並進行變換而不會混淆Interface Builder

我的UITableView是不是全屏幕(所以我不能只在旋轉時我的內容,這是圖片用它水平模式)

我發現,使用變換旋轉我的UITableView。我必須把它在界面位置建設者在一些奇怪的位置,以便旋轉時,它看起來正確.....

有沒有人做過這個沒有搞亂Interface Builder?相同的代碼?

回答

3

請參閱Apple網站上的Windows and Views概念指南中的自動修復行爲部分。這解釋瞭如何在不使用Interface Builder的情況下實現從縱向到橫向的自動旋轉,並且無需處理手動實現複雜變換。

至於旋轉你的自定義內容和禁用滾動,看到shouldAutorotateToInterfaceOrientation:interfaceOrientationwillRotateToInterfaceOrientation:duration:didRotateFromInterfaceOrientation:UIViewController。您可以實施這些方法來攔截旋轉事件,檢查您正在移動的方向,並在那裏處理自定義圖形和屬性設置。

編輯

在回答您的意見,我發現從Table View Programming Guide此位從蘋果:

的UITableView從 的UIScrollView,它定義了與內容較大 觀點滾動 行爲繼承比窗戶的大小。 UITableView重新定義了滾動 的行爲,只允許垂直滾動 。

也許蘋果已經認爲水平滾動表視圖違反了他們的人機界面準則。不知您是否可以重新定義滾動行爲,如果您將其分類爲UITableView,但這可能是一大堆試驗和錯誤工作。如果你真的能夠做到這一點,我相信這裏的很多人會對你如何做到這一點感興趣。我搜索了一會兒,試圖找到其他人的解決方案,但我找不到任何東西。

然後,如果你這樣做,蘋果可能不會允許你的應用程序進入應用程序商店,假設它確實打破了HIG。

+0

謝謝您的回答,但如前所述,UITableView的並不在橫向模式下提供水平滾動。所以如果我使用自動旋轉,它只會上下滾動,而不是左右移動。 – user82383

1

你可以實現你通過執行以下操作找什麼:

  1. 或者通過代碼或通過IB創建一個UITableView並將其連接到一個UIViewController,(不要使用一個UITableViewController)
  2. 應用一個90度逆時針轉換到你的桌子。
  3. 在您的tableView:cellForRowAtIndexPath:方法中,將90度順時針轉換應用於您的單元格,然後再返回它們。

Boum!你現在有一個垂直單元的水平滾動表。您可能需要更正單元格和桌子的寬度和高度,以使所有內容看起來都正確,但我想這可能對您有所幫助。

另一個提示:你可以使用表格圖層來控制旋轉的中心點。 anchorPoint屬性(這是一個CGPoint)。如果您將其設置在視圖邊界中心以外的位置,則旋轉效果(以及任何其他效果)將使用該點作爲參考。

+0

我試過這個,並且似乎無法使桌面正確旋轉回肖像。從肖像旋轉到風景,我可以根據需要調整細胞。但是,旋轉後,tableview不會垂直滾動,而是水平滾動。有什麼想法嗎? –

0

我知道這有點遲,但這是我的答案。

正如其他人所說,要實現水平滾動,您可以將90度轉換應用於tableview。但是,爲了擺脫奇怪的框架錯誤,您必須在轉換之前獲取框架,應用轉換並將框架恢復到原始框架。



// Save the tableview frame (as it is layed out in IB) 
CGRect oldframe = tableview.frame; 

// Apply the transform 
tableview.transform=CGAffineTransformMakeRotation(M_PI/2); 

// For some weird reason, the frame of the table also gets rotated, so you must restore the 
//original frame  
tableview.frame = oldframe; 


+1

使用'M_PI_2'來代替'M_PI'。 –

4

OK,則問題是,由於的tableview的寬度爲柔性的,旋轉後的細胞的寬度(它是實際高度)分別增加太多。我通過繼承的UITableView並重寫layoutSubviews方法克服了這個問題,所以現在看起來是這樣的:

- (void)layoutSubviews { 

    [super layoutSubviews]; 

    for (UIView* child in [self subviews]) { 

     CGRect frame1 = child.frame; 
     if ([child isKindOfClass:[UITableViewCell class]]) { 
      frame1.size.width = 120; 
      child.frame = frame1;   
     } 
    } 

}