在 addSubview 中调用具有动态 ScrollView ContentSize Autolayout 的 CustomView
Posted
技术标签:
【中文标题】在 addSubview 中调用具有动态 ScrollView ContentSize Autolayout 的 CustomView【英文标题】:CustomView with Dynamic ScrollView ContentSize Autolayout called in addSubview 【发布时间】:2018-10-10 14:15:44 【问题描述】:我在 xib 中创建了一个 customView,高度 = 800:
我想通过 addSubview 将它调用到蓝色视图中,如 UIViewController 所示:
这里的问题是我希望我的 UIScrollView 可以动态设置它的 contentSize,因为这里我将它的高度定义为 800:
我从另一篇文章中读到 AutoLayout 中的 contentSize 将由其 subView 的高度定义,在本例中为 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
【问题讨论】:
【参考方案1】:几个问题。
首先,您将customV
的框架设置为wantToShowHereView
的边界——但您是在viewDidLoad()
中这样做的。这个界限几乎肯定会在viewDidLoad()
和您在屏幕上实际看到它的时间(设备大小、方向等)之间发生变化。
其次,customV
是一个 UIView
,您将在其上添加 XIB 的“根视图”(包含您的滚动视图)作为 customV
的子视图 ...但您没有设置任何约束(或其他调整大小的行为)在那个视图上。
第三,您将相对约束与绝对约束(宽度、高度、前导、尾随等)混合在一起,当整体框架发生变化时,这将再次导致问题... 和 您明确设置了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)由滚动视图的实际内容决定,而不是硬编码 @ 的高度987654335@.
编辑:
这是您的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);
【讨论】:
嗨@DonMag,谢谢你的指点。但我还是有点困惑。在 viewDidAppear 我应该向 customV 添加约束对吗?那么当将 customV 添加到 wantToShowHereView 时,那里会有自动布局吗? 约束将是customV和wantToShowHereView之间的约束? 感谢它的工作!很抱歉没有更新给你。谢谢以上是关于在 addSubview 中调用具有动态 ScrollView ContentSize Autolayout 的 CustomView的主要内容,如果未能解决你的问题,请参考以下文章
使用 addSubview 动态添加 UITextField 的 UITableViewCell - 如何在键盘上“返回”时获取 UITextField 值
iPhone,addSubView 不调用 willViewAppear?
如果在 addSubView 之后调用 UIButton 不会移动