使用“自动布局”垂直和水平居中自定义UIView
我正在尝试使用自动布局API新build可用的iOS 6来构build一个相当简单的animation自定义用户界面。我正在构build的自定义视图有一个圆形,我想要以垂直和水平为中心。
不幸的是,我不明白为什么我的约束似乎对UIButton和UILabel元素工作正常,但当我使用自定义视图和自定义CALayer(在这种情况下是一个圆圈,最终将animation),会产生奇怪的结果。
为了清楚起见,我不希望我的视图扩大到填满整个屏幕,而是要有dynamic的“填充”,使视图垂直居中在iPhone 4和5上。我还应该注意到,我很新cocoa和UIKit。
RootViewController.m:
... - (void)viewDidLoad { [super viewDidLoad]; // Create Circle View CGRect circle_view_rect = CGRectMake(0, 0, 100, 100); UIView *circle_view = [[UIView alloc] initWithFrame:circle_view_rect]; // Create Circle Layer CircleLayer *circle_layer = [[CircleLayer alloc] init]; circle_layer.needsDisplayOnBoundsChange = YES; circle_layer.frame = circle_view.bounds; [circle_view.layer addSublayer:circle_layer]; // Enable Auto Layout [circle_view setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:circle_view]; // Center Vertically NSLayoutConstraint *centerYConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]; [self.view addConstraint:centerYConstraint]; // Center Horizontally NSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]; [self.view addConstraint:centerXConstraint]; } ...
CircleLayer.m:
... - (void)drawInContext:(CGContextRef)context { CGContextAddArc(context, 50, 50, 50, 0.0, 2*M_PI, 0); CGContextSetFillColorWithColor(context, [UIColor yellowColor].CGColor); CGContextFillPath(context); } ...
基本上我实施的限制是:
- 在父视图内垂直居中
- 在父视图内水平居中
这是我得到的结果:
任何帮助将不胜感激,我一直在思考这一个几天了。
谢谢
尝试添加一个高度和宽度约束到你的circle_view。 我什至不能只是一个痛苦的方形视图出现在所有没有添加这些(使用您的代码,减去图层的东西)。
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; [circle_view addConstraint:heightConstraint]; NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:circle_view attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:100.0]; [circle_view addConstraint:widthConstraint];
只要添加到rdelmar的答案:
核心问题是,只要你去NSLayoutConstraint
路线,并指定setTranslatesAutoresizingMaskIntoConstraints:NO
,您使用CGRectMake
所做的框架呈现与AutoLayout目的不相关。 这就是为什么它没有使用帧的高度和宽度的信息。
- Autolayout:原点和大小应根据宽度和高度因素而改变
- 组表TableView,使用自调整节标题,重新加载后,如果向上滚动,tableview将跳转
- 我如何做到这一点,如果我淡出我的导航栏,然后实际上隐藏它的程序,如果我撤消这没有时间问题?
- 如何以编程方式在UIScrollView中用AutoLayout设置子视图?
- 属性不可用:8.0版本之前的iOS版本的第一个基线布局属性
- closures“使用Autolayout”导致应用程序只能在纵向模式下运行
- 当我将UIPanGestureRecognizer和自动布局结合在一起时,我的UIViews变得糟糕透顶
- 如何将宽度等同于NSLayoutConstraint的某些UIViews?
- 如何获得iOS 8的UICollectionViewCells的自动布局大小? (在iOS 8中,systemLayoutSizeFittingSize返回高度为零的大小)