从 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 文件加载视图