为啥我的 UIView 子视图没有在父视图中呈现? (附代码)

Posted

技术标签:

【中文标题】为啥我的 UIView 子视图没有在父视图中呈现? (附代码)【英文标题】:why is my UIView subview not rendering within the parent? (code attached)为什么我的 UIView 子视图没有在父视图中呈现? (附代码) 【发布时间】:2011-07-16 04:33:39 【问题描述】:

为什么我的自定义 UIView 没有在其父级的 UIView 容器中呈现?所以我有的是:

MainViewController - 有一个UIView "customViewContainer"(不占据整个屏幕),并且 CustomView - 是带有 XIB 文件的 UIView - 这里是 UIView,当它被渲染(使用 AspectFit)时,它会在父级“customViewContainer”的边界之外渲染

用于设置自定义视图的代码是 MainViewController 的摘录:

>

所以我看不出为什么CustomView 视图的渲染区域比父customViewContainer 更大?我想要的是让customview 完全按照AspectFit 类型的方法适合父“customViewContainer”。

谢谢

EDIT 1(添加说明)-如果我在父视图中“剪辑子视图”,那么它会剪辑东西,但我真正需要在父视图区域内呈现自定义视图(不是屏幕的整个区域)。所以我需要(a)自定义视图的中心位于父视图的中心,以及(b)自定义视图的 AspectFit 正确地放入父视图。有什么想法吗?

编辑 2 - 更新

抱歉 - 在原始问题中使用代码复制/粘贴错误 - 似乎无法编辑它,所以我将在下面放一个正确的版本 - 澄清一下:

MainViewController - 有一个UIViewcontainerView”(不会占据整个屏幕),CustomView - 是带有 XIB 文件的 UIView - 它是 UIView这里,当它被渲染时(使用AspectFit)正在渲染父级“containerView”的边界之外

现在有了下面的代码,这有意义吗?这段代码的原因是我有一个自定义的UIView,但我有一个与之关联的 XIB 文件,所以这是让我的MainController 视图能够使用它的唯一方法。也就是说,在MainControllerview 中有一个容器视图,然后以编程方式将CustomView 添加到容器视图中。

关于“因此,将要添加的视图的框架或中心设置为您想要的”-您是说我必须以编程方式/手动将 CustomView 的尺寸设置为我想要的(相对于父containerView)?

我希望有一种方法可以使用声明性布局设置来说明“从它的 XIB 文件加载自定义视图,并将 aspectFit 这个视图放入 self.containerView”,但是我开始怀疑这是否可能?

更新的代码如下(当我复制/粘贴它并更改变量名称等时在原始问题中犯了错误)

- (void)viewDidLoad

    [super viewDidLoad];
    // Load the custom Altimeter View into this UIControllerView's container UIView for it
    NSArray *nibs = [[NSBundle mainBundle] loadNibNamed:@"Customview" owner:self options:nil];
    for (NSObject *obj in nibs) 
        if ( [obj isKindOfClass:[Customview class]]) 
            Customview *cv = (Customview*)obj;
            [self.containerView addSubview:cv];
            break;
        
    
    // UI Layout
    self.containerView.layer.borderWidth = 2;
    self.containerView.layer.borderColor = [[UIColor redColor] CGColor];

【问题讨论】:

【参考方案1】:

检查IB文件上parent的“Clip subviews”属性是否被选中。

我认为等效代码是self.view.clipsToBounds = YES

如果这是NO,则在外部绘制的子视图将如同绘制在父视图上一样可见。

【讨论】:

谢谢 - 问题是如果我“剪辑子视图”它会剪辑东西,但我真正需要在父视图区域(而不是屏幕的整个区域)内呈现自定义视图。所以我需要(a)自定义视图的中心位于父视图的中心,以及(b)自定义视图的 AspectFit 正确地放入父视图。有什么想法吗? 你能再具体一点吗?我没明白你在这里的意思。 self.view.center = self.parentView.center 应该使视图居中。对于 AspectFit,我不确定是否有内置属性。如果我没记错的话,它只适用于 UIImageView 感谢您的坚持 - 我在主要问题的 EDIT2 中更新/澄清了更多内容 是的,您必须手动将其定位到父级的中心。 “声明式”定位适用于所有四个角,但不适用于中心。使用 autoresizingMasks。对于“Aspect Fit”自定义视图,您必须手动编写代码。关于如何在此处适应 CoreGraphics 渲染视图的一些逻辑。 vocaro.com/trevor/blog/2009/10/12/… 谢谢哥们。它真的对我有帮助。但我不明白这是在做什么。剪辑是什么意思?

以上是关于为啥我的 UIView 子视图没有在父视图中呈现? (附代码)的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 UIButton 没有显示在我的子视图中? iPad 应用程序

检测一个 UIView 是不是在父级中的另一个 UIView 后面

为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?

为啥我的 UIView 中没有显示任何内容?

子视图单击项目以显示在父视图标签中

为啥我们不能把 UIView 的子视图放在它的 CALayer 前面?