CustomView with Dynamic Sc​​rollView 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;

}

setupcustomView.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);

}