使用自动布局的屏幕外 UIView(以编程方式)
Posted
技术标签:
【中文标题】使用自动布局的屏幕外 UIView(以编程方式)【英文标题】:Offscreen UIView using Auto-layouts (programmatically) 【发布时间】:2015-07-23 18:22:52 【问题描述】:这在预自动布局域中非常简单,但是将子视图插入超级视图以使子视图完全或部分脱离屏幕的编程方式是什么:
一个示例代码,它将添加一个子视图,使其顶部、底部、左侧和右侧的 5 个像素为:
NSDictionary* viewsDictionary = @@"subview":subView;
[self.view addSubview:subView];
NSArray* horizontalMargins = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-5-[subview]-5-|" options:0 metrics:nil views:viewsDictionary];
NSArray* verticalMargins = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-5-[subview]-5-|" options:0 metrics:nil views:viewsDictionary];
[self.view addConstraints:horizontalMargins];
[self.view addConstraints:verticalMargins];
这个问题的答案将帮助我使用自动布局实现滑入滑出动画。
【问题讨论】:
【参考方案1】:我不直接使用 NSLayoutConstraint 而是使用 PureLayout (https://github.com/smileyborg/PureLayout) 让语法稍微友好一些。
使用 Purelayout 我相信您可以使用以下代码:
[subView autoPinEdgeToSuperviewEdge:ALEdgeTop
withInset:-5.0f];
[subView autoPinEdgeToSuperviewEdge:ALEdgeLeft
withInset:5.0f];
[subView autoPinEdgeToSuperviewEdge:ALEdgeRight
withInset:-5.0f];
【讨论】:
不想为这么简单的事情使用外部库,您可以查看我的回复【参考方案2】:经过几个小时的挣扎和尝试,我设法使用以下代码产生了所需的结果。我没有为 top 设置任何约束,而是需要高度约束,以便子视图知道要走多高。
NSDictionary* viewsDictionary = @@"subview":subView;
NSArray* horizontalMargins = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[subview]-0-|" options:0 metrics:nil views:viewsDictionary];
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0];
NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-200];
heightConstraint.active = YES;
bottomConstraint.active = YES;
[NSLayoutConstraint activateConstraints:horizontalMargins];
我希望在动画块中更改约束值将使我获得滑入/滑出过渡。
【讨论】:
以上是关于使用自动布局的屏幕外 UIView(以编程方式)的主要内容,如果未能解决你的问题,请参考以下文章