UITableViewWrapperView和UITableView大小因自动布局而异

Kat*_*kas 17 uitableview ios swift

我正在聊天.一切似乎都很好,但我遇到了一些'越野车'的问题.

我得到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)
Run Code Online (Sandbox Code Playgroud)

当键盘出现时:

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)
Run Code Online (Sandbox Code Playgroud)

因此,在我增加约束常量之后,UITableViewWrapperView的大小与它的superview - 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")
}
Run Code Online (Sandbox Code Playgroud)

所以似乎那里发生了一些令人困扰的事情 UITableViewWrapperView

ano*_*dev 36

以下为我修好了:

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

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    fixTableViewInsets()
}
Run Code Online (Sandbox Code Playgroud)

我发现在viewWillAppear()中,insets都是0.但是在viewDidAppear()中,它们被修改为显然偏移了导航栏等.这使得UITableViewWrapperView与UITableView不同.我在自己的例程中更改了insets,以便更容易尝试从不同的地方调用它.viewWillLayoutSubviews()让它在呈现之前被更改 - 将更改放在viewDidAppear()中会导致表格抖动.


小智 10

今天我遇到了这个问题,虽然@anorskdev建议的修复工作很好,但问题的根本原因似乎是automaticallyAdjustsScrollViewInsetsUIViewController 的属性,true默认情况下.我在故事板中将其关闭,问题就消失了.在View Controller检查器中查找"调整滚动视图插入"复选框,并确保未选中它.

  • _This_ 应该是正确的答案,而不是上面的那个(即使它有效) (2认同)

Tho*_*rax 8

它似乎是一个bug(与这个bug争夺一整天对我来说)最后这个解决方法帮助:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它不是苹果禁用的API之一吗?(UITableViewWrapperView) (2认同)

Mar*_*aňa 6

经过小调查中,我发现这个解决方案的所有设置safeAreaInsets,并layoutMarginsUITableView零:

Swift 4 片段:

class CustomTableView: UITableView {

	override var safeAreaInsets: UIEdgeInsets {
		get {
			return .zero
		}
	}

	override var layoutMargins: UIEdgeInsets {
		get {
			return .zero
		}

		set {
			super.layoutMargins = .zero
		}
	}
}
Run Code Online (Sandbox Code Playgroud)

主要问题是引入了 safeAreaInsets tvOS 11.0-UITableViewWrapperView只是从父视图 (UITableView) 中获取属性并使用 safeAreaInsets 呈现内容。