CustomView with Dynamic ScrollView ContentSize Autolayout 在 addSubview 中调用
CustomView with Dynamic ScrollView ContentSize Autolayout called in addSubview
我在 xib 中创建了一个高度 = 800 的 customView :
我想通过 addSubview 将其调用到 UIViewController 中所示的蓝色视图中:
这里的问题是我希望我的 UIScrollView 可以动态设置它的 contentSize,因为这里我将它的高度定义为 800 :
我从另一篇文章中了解到,AutoLayout 中的 contentSize 将由其子视图(在本例中为 contentView)的高度定义。但是在我将高度设置为 800 之后,滚动仍然没有到达视图的底部(粉红色)。那么如何设置自动布局呢?
这是我在 customView 中的代码:
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"initWithFrame");
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"initWithCoder");
self = [super initWithCoder:aDecoder];
if(self) {
[self setup];
}
return self;
}
- (void)setup {
[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
[self addSubview:self.view];
NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
NSLog(@"contentView Height :%f", self.contentView.frame.size.height);
}
在我的 ViewController.m 中,我这样称呼它:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
[self.wantToShowHereView addSubview:customV];
}
有人可以指导我如何实现它吗?
这是我的示例项目,让您清楚:AutoLayoutScrollView Example
几个问题。
首先,您将 customV
的框架设置为 wantToShowHereView
的边界——但您在 viewDidLoad()
中这样做。该边界几乎肯定会在 viewDidLoad()
和您实际在屏幕上看到它的时间(设备尺寸、方向等)之间发生变化。
其次,customV
是一个 UIView
,您要将 XIB 的 "root view"(其中包含您的滚动视图)作为子视图添加到 customV
...但您没有在 that 视图上设置任何约束(或其他调整大小的行为)。
第三,您将相对约束与绝对约束(宽度、高度、前导、尾随等)混合在一起,当整体框架发生变化时,这将再次导致问题...and 你明确地设置了 customV
的框架,而不是在 运行 时间添加约束。
您可以开始修复问题:
第一步 - 从 viewDidLoad()
中移除 customV
实例化。
第二步 - 添加以下 viewDidAppear()
方法。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
customV.view.frame = customV.bounds;
[self.wantToShowHereView addSubview:customV];
}
只这样做应该 给你一个正确的可滚动视图。
不过,您可能想要做的是将 init 保留在 viewDidAppear()
中,但在那里添加约束以利用自动布局。
此外,我建议重新处理 customView.xib
中元素的约束,以便滚动(contentSize)由滚动视图的实际内容决定,而不是通过硬编码你的身高 contentView
.
编辑:
这是您的 viewDidLoad
的外观(在 ViewController.m
中):
- (void)viewDidLoad
{
[super viewDidLoad];
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
[self.wantToShowHereView addSubview:customV];
customV.translatesAutoresizingMaskIntoConstraints = NO;
[customV.topAnchor constraintEqualToAnchor:self.wantToShowHereView.topAnchor].active = YES;
[customV.bottomAnchor constraintEqualToAnchor:self.wantToShowHereView.bottomAnchor].active = YES;
[customV.leadingAnchor constraintEqualToAnchor:self.wantToShowHereView.leadingAnchor].active = YES;
[customV.trailingAnchor constraintEqualToAnchor:self.wantToShowHereView.trailingAnchor].active = YES;
}
和 setup
在 customView.m
:
- (void)setup {
[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
[self addSubview:self.view];
self.view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
[self.view.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
[self.view.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
[self.view.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
NSLog(@"contentView Height :%f", self.contentView.frame.size.height);
}
我在 xib 中创建了一个高度 = 800 的 customView :
我想通过 addSubview 将其调用到 UIViewController 中所示的蓝色视图中:
这里的问题是我希望我的 UIScrollView 可以动态设置它的 contentSize,因为这里我将它的高度定义为 800 :
我从另一篇文章中了解到,AutoLayout 中的 contentSize 将由其子视图(在本例中为 contentView)的高度定义。但是在我将高度设置为 800 之后,滚动仍然没有到达视图的底部(粉红色)。那么如何设置自动布局呢?
这是我在 customView 中的代码:
- (id)initWithFrame:(CGRect)frame
{
NSLog(@"initWithFrame");
self = [super initWithFrame:frame];
if (self) {
[self setup];
}
return self;
}
- (id)initWithCoder:(NSCoder *)aDecoder {
NSLog(@"initWithCoder");
self = [super initWithCoder:aDecoder];
if(self) {
[self setup];
}
return self;
}
- (void)setup {
[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
[self addSubview:self.view];
NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
NSLog(@"contentView Height :%f", self.contentView.frame.size.height);
}
在我的 ViewController.m 中,我这样称呼它:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
[self.wantToShowHereView addSubview:customV];
}
有人可以指导我如何实现它吗? 这是我的示例项目,让您清楚:AutoLayoutScrollView Example
几个问题。
首先,您将 customV
的框架设置为 wantToShowHereView
的边界——但您在 viewDidLoad()
中这样做。该边界几乎肯定会在 viewDidLoad()
和您实际在屏幕上看到它的时间(设备尺寸、方向等)之间发生变化。
其次,customV
是一个 UIView
,您要将 XIB 的 "root view"(其中包含您的滚动视图)作为子视图添加到 customV
...但您没有在 that 视图上设置任何约束(或其他调整大小的行为)。
第三,您将相对约束与绝对约束(宽度、高度、前导、尾随等)混合在一起,当整体框架发生变化时,这将再次导致问题...and 你明确地设置了 customV
的框架,而不是在 运行 时间添加约束。
您可以开始修复问题:
第一步 - 从 viewDidLoad()
中移除 customV
实例化。
第二步 - 添加以下 viewDidAppear()
方法。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
customV.view.frame = customV.bounds;
[self.wantToShowHereView addSubview:customV];
}
只这样做应该 给你一个正确的可滚动视图。
不过,您可能想要做的是将 init 保留在 viewDidAppear()
中,但在那里添加约束以利用自动布局。
此外,我建议重新处理 customView.xib
中元素的约束,以便滚动(contentSize)由滚动视图的实际内容决定,而不是通过硬编码你的身高 contentView
.
编辑:
这是您的 viewDidLoad
的外观(在 ViewController.m
中):
- (void)viewDidLoad
{
[super viewDidLoad];
customView *customV = [[customView alloc] initWithFrame:self.wantToShowHereView.bounds];
[self.wantToShowHereView addSubview:customV];
customV.translatesAutoresizingMaskIntoConstraints = NO;
[customV.topAnchor constraintEqualToAnchor:self.wantToShowHereView.topAnchor].active = YES;
[customV.bottomAnchor constraintEqualToAnchor:self.wantToShowHereView.bottomAnchor].active = YES;
[customV.leadingAnchor constraintEqualToAnchor:self.wantToShowHereView.leadingAnchor].active = YES;
[customV.trailingAnchor constraintEqualToAnchor:self.wantToShowHereView.trailingAnchor].active = YES;
}
和 setup
在 customView.m
:
- (void)setup {
[[NSBundle mainBundle] loadNibNamed:@"customView" owner:self options:nil];
[self addSubview:self.view];
self.view.translatesAutoresizingMaskIntoConstraints = NO;
[self.view.topAnchor constraintEqualToAnchor:self.topAnchor].active = YES;
[self.view.bottomAnchor constraintEqualToAnchor:self.bottomAnchor].active = YES;
[self.view.leadingAnchor constraintEqualToAnchor:self.leadingAnchor].active = YES;
[self.view.trailingAnchor constraintEqualToAnchor:self.trailingAnchor].active = YES;
NSLog(@"contentSize Height :%f", self.myscrollview.contentSize.height);
NSLog(@"contentView Height :%f", self.contentView.frame.size.height);
}