【问题标题】:Frame doesn't update for autolayout subview of UITableViewCell框架不会为 UITableViewCell 的自动布局子视图更新
【发布时间】:2014-10-07 08:29:16
【问题描述】:

我正在尝试为自定义 UITableViewCell 的子视图添加阴影。子视图作为单元格的可见背景(单元格的根视图清晰)。

单元格在界面构建器中使用 xib 进行布局。子视图使用自动布局约束对单元格的 4 个边缘进行布局。

对于不同宽度的设备,子视图本身似乎可以自动调整大小。从堆栈溢出研究中,我认为我必须将我的帧相关代码放在 layoutSubviews 方法中。我把我的阴影绘制代码放在那里:

layer.shadowPath = [[UIBezierPath bezierPathWithRoundedRect:subView.bounds cornerRadius:3.0]CGPath];

阴影出现了,但只是调整大小之前的框架大小,经过一些调试后似乎是视图框架矩形,界面构建器中的一个可修改常量(对于自动布局视图控制器实际上是灰色的:@ )。

从进一步的调试来看,子视图框架似乎永远不会更新,即使单元格视图框架是。(这是通过在 layoutSubviews 中打印视图框架的宽度来执行的)

 layoutSubviewscalled, parent view frame size: 180 subview frame size: 148.000000
 layoutSubviewscalled, parent view frame size: 375 subview frame size: 148.000000

这是一个错误吗?我错过了什么吗?我能做些什么来谴责这个?

【问题讨论】:

    标签: uitableview autolayout xcode6 xib


    【解决方案1】:

    正如in this answer 所见,您应该在将 UIBezierPath 作为 shadowPath 插入之前调用 [self setNeedsLayout]。

    【讨论】:

    • 非常感谢您的回复。我以前看过这个答案,但不够耐心。这似乎有效,但仅在第三个 layoutSubviews 调用中有效。有什么想法我只能在视图更新后绘制阴影吗?
    • @SameerJJ 原来我也遇到了自动布局问题,在我的情况下,现在我在我的视图控制器上初始化我的自定义 UIScrollView 之前调用self.layoutIfNeeded()(如 Apple 文档所述:使用接收消息的视图作为根视图,此方法从根开始布局视图子树。)您尝试在[self setNeedsLayout] 后跟[self layoutIfNeeded]
    • 是的,我确实尝试过,但没有成功。即使布局最终返回正确的帧大小,它仍然总体上相当错误。我真的认为苹果需要在这方面加紧努力,让自动布局不再那么痛苦。我已经回到这个单元格的编程视图布局。感谢您的帮助
    • 我不认为 AutoLayout 使用起来很糟糕(也许是因为我总是认为每当我遇到问题时我都不知道)。我会给随机搜索者提供另一个帮助,尽管不适用于 Sameer 的问题:确保在 viewDidAppear() 而不是 viewDidLoad() 上需要 frame 时开始子视图的绘制和初始化,这样你就可以确定所有的帧都是正确的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2019-12-19
    相关资源
    最近更新 更多