UIView 的子视图在边界外渲染

Posted

技术标签:

【中文标题】UIView 的子视图在边界外渲染【英文标题】:UIView's subviews rendering outside bounds 【发布时间】:2016-02-12 17:36:50 【问题描述】:

我在界面生成器中为视图创建了一个笔尖。它的子视图放置有约束,以便它们可以随着视图框架的大小而缩放。

我使用辅助方法从其 nib 初始化视图:

+ (TinyTestResultsView *)ttrView 
    TinyTestResultsView *ttrV = [[[NSBundle mainBundle] loadNibNamed:@"TinyTestResultsViewNib" owner:nil options:nil] firstObject];
    [ttrV commonInit];
    return ttrV;

在视图控制器的viewDidLoad 期间,我使用ttrView 方法初始化对象并将其作为子视图添加到self.view。然后 VC 调用网络以获取一些信息,然后根据需要将约束添加到 self.view 和放置它的子视图。它被正确放置和调整大小 - 但是视图显示为没有子视图的白框。 为什么子视图会在视图外渲染?

如果我在 Xcode 中使用 Debug View Hierarchy 然后尝试查找子视图,我会看到它们被渲染到框架之外,并且它们不符合 NIB 的自动布局规则。我对不同的自定义 UIView/nib 使用了完全相同的技术,所以我不确定会发生什么错误。

【问题讨论】:

【参考方案1】:

您的视图似乎需要将translatesAutoresizingMaskIntoConstraints 设置为NO。当您以这种方式从 Nib 文件加载视图时,此属性设置为 YES,这意味着系统会创建一组约束,这些约束复制视图的自动调整大小掩码指定的行为。当您使用自动布局时,这不是您想要的。

【讨论】:

我在commonInit中有self.translatesAutoresizingMaskIntoConstraints = NO; 您没有与此视图的 nib 文件中的约束相关的警告吗? 在 nib 文件的预览中尝试look(如果您还没有这样做)。视图的布局是否正确? 无约束冲突,预览照原样呈现。 感谢您的帮助@curious。在刷新期间,我删除了视图的所有约束,没有意识到这些约束真正影响了它的子视图,而不仅仅是视图本身。修好了。

以上是关于UIView 的子视图在边界外渲染的主要内容,如果未能解决你的问题,请参考以下文章

如何使以编程方式生成的子视图符合超级视图(iOS)的边界?

确保可拖动的图像视图保持在框架的边界内

动画边界更改时具有 CALayer 有线效果的自定义视图

动画边界更改时具有 CALayer 有线效果的自定义视图

UIScrollView 子视图在缩放下不保持正确的边界尺寸

将框架绑定到超级视图边界 UIView 扩展