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

时间:2014-08-19 17:10:24

标签: objective-c xcode uiscrollview autolayout nib

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

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

- (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;
}

页面被添加到scrollview中,如下所示,下面的代码是TutorialViewController.m的一部分,它有一个有效的scrollview插座:

- (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 个答案:

答案 0 :(得分:3)

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

- (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;
}

这似乎对我来说比较适用于我根据您的代码构建的更简单的应用程序。