我正在建立聊天。一切似乎都还不错,但我遇到了“ buggy ”问题。
我得到了带有UITextView栏的UIViewController,用于输入消息和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的大小与其父 View UITableView有所不同。有没有办法来解决这个问题 ?我假设
UITableViewWrapperView
将根据UITableView
更改其框架和范围,但不会。有任何想法可以解决问题,或者我应该如何解决?
添加:
经过更多研究-似乎它发生在
viewWillLayoutSubviews
和viewDidLayoutSubviews
之间。这有点奇怪: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
困惑 最佳答案
以下为我修复了它:
func fixTableViewInsets() {
let zContentInsets = UIEdgeInsetsZero
tableView.contentInset = zContentInsets
tableView.scrollIndicatorInsets = zContentInsets
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
fixTableViewInsets()
}
我发现在viewWillAppear()上插入全部为0。但是在viewDidAppear()上,它们已被修改为导航栏等的明显偏移。这使UITableViewWrapperView与UITableView不同。
我在自己的例程中更改了插图,以便更轻松地尝试从不同的地方调用它。 viewWillLayoutSubviews()可以在呈现之前对其进行更改-将更改放置在viewDidAppear()中会导致表发生故障。