Ios 从NIB加载的UIView-帧大小错误

Ios 从NIB加载的UIView-帧大小错误,ios,Ios,好的,我在interface builder中创建了一个UIView。我使用的是AutoLayout,这个视图的一个子视图固定在所有四个侧面 这是我不明白的。当我使用loadNibNamed加载此NIB文件时。然后我得到一个对视图的引用。我为这个视图设置了框架。然而,当我访问子视图(使用[containerView-viewWithTag:1])时,它的框架并没有自动调整大小。有什么好处?如果更改父视图的框架,为什么子视图框架也不会更改 这没有任何意义 为什么您不能加载一个ui视图,设置它的框架

好的,我在interface builder中创建了一个
UIView
。我使用的是
AutoLayout
,这个视图的一个子视图固定在所有四个侧面

这是我不明白的。当我使用
loadNibNamed
加载此NIB文件时。然后我得到一个对视图的引用。我为这个视图设置了框架。然而,当我访问子视图(使用[
containerView-viewWithTag:1
])时,它的框架并没有自动调整大小。有什么好处?如果更改父视图的框架,为什么子视图框架也不会更改

这没有任何意义

为什么您不能加载一个
ui视图
,设置它的框架,并让所有子视图进行适当的调整(尤其是在我使用
AutoLayout
!)


编辑:说得很清楚,我想做的就是在IB中定义一个具有适当的
AutoLayout
约束的
UIView
层次结构,然后能够在屏幕上加载和显示该视图,有时大小不同?为什么这么难?

UIKit不会在更改视图的几何图形时立即更新子视图几何图形。它批量更新以提高效率

运行事件处理程序后,UIKit检查屏幕窗口层次结构中是否需要布局任何视图。如果找到任何布局约束,它将通过解决布局约束(如果有),然后发送
layoutSubviews
来进行布局

如果要解决约束并立即布置视图的子视图,只需将
layoutifneedd
发送到视图:

someView.frame = CGRectMake(0, 0, 200, 300);
[someView layoutIfNeeded];
// The frames of someView.subviews are now up-to-date.

我也有同样的问题,我正在创建一个教程视图,我想在其中向scrollview添加多个UIView。当我试图从xib获取框架时,它总是给出320,正因为如此,页面的偏移量是错误的,在iPhone6和6plus中我的视图看起来很糟糕

然后,我使用纯自动布局方法,即不使用框架,而是通过VFL添加约束,以便子视图与superview完全匹配。下面是代码的快照,我从Xib创建了大约20个UIView,并正确地添加到scrollview

完整代码在这里

方法在scrollview中布局子视图。 @准零 @结果布局子视图 */ -(无效)布局视图 { NSMutableString*水平字符串=[NSMutableString]; //保持水平约束的起点 [水平字符串appendString:@“H:|”];
对于(int i=0;i不幸的是,Rob接受的答案对我不起作用。这就是起作用的原因:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
        [self addSubview:views[0]];
        self.subviews[0].frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); //ADDED THIS FOR PROPER SIZE   
    }
    return self;
}

Rob,你是一位绅士和学者。谢谢你!你能为我解释一下吗?当我创建笔尖时,我实际上定义了项目之间的一组关系。绝对没有硬编码的大小。只有一个子视图被固定在父视图的墙上(即父母和孩子之间的关系,父母说“无论我长得多大,你都会变大”).所以…真的,当您第一次在代码中加载NIB时,它不应该有视图大小,框架的第一个设置应该创建正确的大小?为什么不这样工作?当您加载NIB时,视图具有NIB中为其定义的任何大小。当您在代码中更改根视图的大小时,您必须为此运行layout要通过约束传播到子级的更改。
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        NSArray *views = [[NSBundle mainBundle] loadNibNamed:@"myXib" owner:self options:nil];
        [self addSubview:views[0]];
        self.subviews[0].frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height); //ADDED THIS FOR PROPER SIZE   
    }
    return self;
}