9

好的,所以我创建了一个UIView界面生成器。我正在使用AutoLayout,并且我已经将这个视图的一个子视图固定到所有四个方面。

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

这没有任何意义。

为什么你不能只加载一个UIView,设置它的框架并适当调整所有子视图(特别是因为我正在使用AutoLayout!)?

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

4

3 回答 3

13

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

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

如果您想解决约束并立即布置视图的子视图,只需发送layoutIfNeeded到视图:

someView.frame = CGRectMake(0, 0, 200, 300);
[someView layoutIfNeeded];
// The frames of someView.subviews are now up-to-date.
于 2013-09-20T05:20:16.960 回答
1

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

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

完整代码在这里ScrollViewAutolayout

 Method to layout the childviews in the scrollview.
 @param nil
 @result layout the child views
 */
-(void)layoutViews
{
    NSMutableString *horizontalString = [NSMutableString string];
    // Keep the start of the horizontal constraint
    [horizontalString appendString:@"H:|"];
    for (int i=0; i<viewsArray.count; i++) {
        // Here I am providing the index of the array as the view name key in the dictionary
        [viewsDict setObject:viewsArray[i] forKey:[NSString stringWithFormat:@"v%d",i]];
        // Since we are having only one view vertically, then we need to add the constraint now itself. Since we need to have fullscreen, we are giving height equal to the superview.
        NSString *verticalString = [NSString stringWithFormat:@"V:|[%@(==parent)]|", [NSString stringWithFormat:@"v%d",i]];
        // add the constraint
        [contentScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalString options:0 metrics:nil views:viewsDict]];
        // Since we need to horizontally arrange, we construct a string, with all the views in array looped and here also we have fullwidth of superview.
        [horizontalString appendString:[NSString stringWithFormat:@"[%@(==parent)]", [NSString stringWithFormat:@"v%d",i]]];
    }
    // Close the string with the parent
    [horizontalString appendString:@"|"];
    // apply the constraint
    [contentScrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:horizontalString options:0 metrics:nil views:viewsDict]];
}
于 2015-09-11T18:21:32.633 回答
0

不幸的是,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;
}
于 2017-02-27T12:17:33.427 回答