2014-12-27 87 views
14

我正在建立一個聊天。一切似乎都很好,但我碰到了一種'越野車'的問題。UITableViewWrapperView和UITableView的大小因自動佈局而異

我得到UIViewController與UITextView欄輸入消息和UITableView。 他們在這個約束:"V:|-(64)-[chatTable][sendMessageBar]-(keyboard)-|"。 當鍵盤沒有出來時 - 這個約束的常量是0。和鍵盤出來後 - 我增加常數鍵盤高度。

當鍵盤不出來:

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-490.0,375.0,568.5) 
self.table.frame = (0.0,64.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,568.5) 

當鍵盤出來:

self.table.contentSize = (375.0,78.5) 
self.table.bounds = (0.0,-274.0,375.0,352.5 
self.table.frame = (0.0,64.0,375.0,352.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,-137.5,375.0,137.5) 
self.table.subviews[0].frame (UITableViewWrapperView) = (0.0,0.0,375.0,137.5) 

所以UITableViewWrapperView,之後我增加限制不變,不同的尺寸,以它的父 - 的UITableView 。有沒有辦法來解決這個問題 ?我會假設UITableViewWrapperView將根據UITableView更改其框架和邊界,但它不會。

任何想法是哪裏的問題或我該如何解決它?

補充說:

一些調查研究後 - 它似乎viewWillLayoutSubviewsviewDidLayoutSubviews之間的某處發生。這是有點怪異壽:

override func viewWillLayoutSubviews() { 
    println("WrapperView Frame :991: \(self.table.subviews[0].frame)") \\ WrapperView Frame :991: (0.0,0.0,375.0,568.5) 
    super.viewWillLayoutSubviews() 
    println("WrapperView Frame :992: \(self.table.subviews[0].frame)") \\ WrapperView Frame :992: (0.0,0.0,375.0,568.5) 
} 

override func viewDidLayoutSubviews() { 
    println("WrapperView Frame :6: \(self.table.subviews[0].frame)") \\ WrapperView Frame :6: (0.0,-137.5,375.0,137.5) 
    super.viewDidLayoutSubviews() 
    println(">> viewDidLayoutSubviews") 
} 

如此看來,有事有沒有攪亂UITableViewWrapperView

回答

7

看來,這是一個錯誤(這個錯誤戰鬥了一整天對我來說) 最後this解決方法幫助:

for (UIView *subview in tableView.subviews) 
{ 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewWrapperView"]) 
    { 
     subview.frame = CGRectMake(0, 0, tableView.bounds.size.width, tableView.bounds.size.height); 
    } 
} 
+2

它不是蘋果的禁止API之一嗎? (UITableViewWrapperView) – 2015-09-22 04:27:11

+0

這是禁止或不。我需要使用它。但害怕。 – anamika41 2017-12-28 09:55:25

28

以下固定對我來說:

func fixTableViewInsets() { 
    let zContentInsets = UIEdgeInsetsZero 
    tableView.contentInset = zContentInsets 
    tableView.scrollIndicatorInsets = zContentInsets 
} 

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 
    fixTableViewInsets() 
} 

我發現,在viewWillAppear()的插圖都是0.但在viewDidAppear(),他們已被修改,以明顯抵消導航欄等。這使得UITableViewWrapperView不同於UITableView。 我改變了自己的例程中的插圖,以便從不同的地方調用它更容易。 viewWillLayoutSubviews()讓它在呈現之前得到更改 - 將更改放在viewDidAppear()中會導致表格變動。

+0

非常感謝,它對我來說非常合適 – f1rstsurf 2016-05-04 16:55:44

+1

這應該是問題的正確答案。爲我工作。 – 2016-09-23 14:45:17

+0

謝謝,這解決了我的問題。任何想法是什麼導致這種行爲?我有2個桌面視圖,只有一個表演是這樣的,即使它們顯示在相同的內容視圖中。 – 2016-10-13 14:47:57

4

我今天遇到了這個問題,雖然@anorskdev提出的修復工作很好,但問題的根源似乎是UIViewController的automaticallyAdjustsScrollViewInsets屬性,默認爲true。我在故事板中關掉它,問題就消失了。在View Controller檢查器中查找「Adjust Scroll View Insets」複選框,並確保它未被選中。

+0

_這應該是正確的答案,而不是上面的那個(儘管它有效) – SparkyRobinson 2018-03-06 05:25:55