从 NIB 加载视图以用作滚动视图中的页面会取消自动布局

Posted

技术标签:

【中文标题】从 NIB 加载视图以用作滚动视图中的页面会取消自动布局【英文标题】:Loading views from NIB to use as pages in a scrollview cancels autolayout 【发布时间】:2014-08-19 17:10:24 【问题描述】:

我已经搜索了这个问题,但没有找到有效的答案。 我需要显示一个分页滚动视图,显示从 .xib 文件加载的一些视图,这是我的代码:

这是 UIView 的子类 TutorialPage.m 的初始化代码:

- (id)initWithFrame:(CGRect)frame andPage:(int) page

self = [super initWithFrame:frame];
if (self) 
     NSLog(@"tutorial page %d initialized", page);
    switch (page) 
        case 0:
            self.view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialPage01View" owner:self options:nil] objectAtIndex:0];
            break;
        case 1:
            self.view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialPage02View" owner:self options:nil] objectAtIndex:0];
            break;
        default:
            break;
    

    NSLog(@"frame %g %g, %g %g", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height);

    [self addSubview:self.view];





return self;

页面添加到滚动视图如下,下面的代码是 TutorialViewController.m 的一部分,它有一个有效的滚动视图出口:

- (void)viewDidLayoutSubviews


NSLog(@"tutorial view loaded");

self.scrollView.scrollEnabled = YES;
self.scrollView.pagingEnabled = YES;
self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * 2, self.scrollView.frame.size.height);

for (int i = 0 ; i < 2 ; i++) 

    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * i;
    frame.origin.y = 0;
    frame.size = self.scrollView.frame.size;

    UIView *subview = [[TutorialPage01 alloc] initWithFrame:frame andPage:i];

    [self.scrollView addSubview:subview];




布局分为两半,垂直。并且每一半都有约束,使其与容器视图匹配并具有相等的高度。

问题是

当视图被添加到滚动视图时,它们会忽略自动布局,并且应该具有 (290, 538) 大小的子视图显示为 (320,568),因此它会侵入其他页面。

是否可以在 .xib 文件中添加约束,然后在代码中将其应用于添加的超级视图?

提前致谢!

【问题讨论】:

【参考方案1】:

这是一种快速而肮脏的方法。由于您是以编程方式添加新框架,因此您还应确保要替换的视图符合您正在启动的框架。

- (id)initWithFrame:(CGRect)frame andPage:(int) page

    self = [super initWithFrame:frame];
    if (self) 
        UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"TutorialView" owner:self options:nil] objectAtIndex:0];
        view.frame = self.frame;
        [self addSubview:view];
    
    return self;

在我根据您的代码构建的一个更简单的应用程序中,这似乎对我有用。

【讨论】:

以上是关于从 NIB 加载视图以用作滚动视图中的页面会取消自动布局的主要内容,如果未能解决你的问题,请参考以下文章

Interface Builder:如何从 nib 文件加载视图

滚动视图中的自定义页面视图设计

对从 nib 加载的子视图应用阴影

iOS 从 nib 加载视图会造成内存泄漏?

当视图控制器从 nib 文件加载时,以模态方式在当前上下文中呈现视图控制器

从 xib 加载 UITableViewCell 会导致加载 nib 但未设置视图出口