CALayer IOS上的自动布局约束
嗨,我正在开发iPhone应用程序,我试图设置编辑文本的一个边框。 我以下面的方式做了这个:
int borderWidth = 1; CALayer *leftBorder = [CALayer layer]; leftBorder.borderColor = [UIColor whiteColor].CGColor; leftBorder.borderWidth = borderWidth; leftBorder.frame = CGRectMake(0, textField.frame.size.height - borderWidth, textField .frame.size.width, borderWidth); [textField.layer addSublayer:leftBorder];
我在IB的编辑文本中join了一些约束,这样当我旋转我的设备时,它将根据这个调整文本字段的宽度。 我的问题是调整edittext的宽度,而不是调整我为我的编辑文本设置的CALayer的宽度。 所以我想我也必须为CALayer项目设置一些限制。 但我不知道该怎么做。 有人知道吗? 需要帮忙。 谢谢。
整个自动化业务是特定于视图的。 图层不会自动resize。
你必须做的 – 在代码中 – 是自己调整图层的大小
例如
在一个viewController你会做的
- (void) viewDidLayoutSubviews { [super viewDidLayoutSubviews]; //if you want superclass's behaviour... // resize your layers based on the view's new frame self.editViewBorderLayer.frame = self.editView.bounds; }
或者在您可以使用的自定义UIView中
- (void)layoutSubviews { [super layoutSubviews]; //if you want superclass's behaviour... (and lay outing of children) // resize your layers based on the view's new frame layer.frame = self.bounds; }
结帐这个解决scheme。 使用KVO,如下所示的path“YourView.bounds”。
self.addObserver(self, forKeyPath: "YourView.bounds", options: .New, context: nil)
然后如下处理。
override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if (keyPath == "YourView.bounds") { YourLayer.frame = YourView.bounds return } super.observeValueForKeyPath(keyPath, ofObject: object, change: change, context: context) }
有关更多信息,请参阅以下链接。
我实现了自定义视图的layoutSubviews方法; 在这个方法中,我只是更新每个子图层的框架,以匹配我的子视图图层的当前边界。
-(void)layoutSubviews{ sublayer1.frame = self.layer.bounds; }
根据这个答案, layoutSubviews
不会在所有需要的情况下被调用。 我发现这种代表方法更有效:
- (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if(self != nil) { [self.layer addSublayer:self.mySublayer]; } return self; } - (void)layoutSublayersOfLayer:(CALayer*)layer { self.mySublayer.frame = self.bounds; }
我有一个类似的问题 – 需要设置一个“CALayer”框架时使用自动布局与视图(在代码中,而不是IB )。
就我而言,我有一个稍微复杂的层次结构,在视图控制器中有一个视图控制器。 我结束了这个问题,并研究了使用viewDidLayoutSubviews
的方法。 这没有用。 以防万一你的情况与我自己的情况类似,这是我发现的…
概观
我想为使用自动布局约束的UIViewController
的子视图定位UIView
的CAGradientLayer
框架。
调用子视图gradientView
和视图控制器child_viewController
。
child_viewController
是我设置为一种可重用组件的视图控制器。 所以, child_viewController
的view
被组成一个父视图控制器 – 调用parent_viewController
。
当调用child_viewController
viewDidLayoutSubviews
, child_viewController
的frame
尚未设置。
(在这一点上,我build议在周围撒一些NSLog
语句来感受在层次结构中创build视图的顺序等)
所以我继续尝试使用viewDidAppear
。 但是,由于child_viewController
的嵌套性质,我发现viewDidAppear
没有被调用。
(看到这个问题: viewWillAppear,viewDidAppear没有被调用,不开火 )。
我目前的解决scheme
我已经在parent_viewController
添加了viewDidAppear
,从那里我调用child_viewController
viewDidAppear
。
对于初始加载,我需要viewDidAppear
因为直到在child_viewController
中调用所有的子视图都设置了它们的框架。 然后我可以设置CAGradientLayer
的框架…
我说过这是我目前的解决scheme,因为我不是特别满意。
在最初设置CAGradientLayer
的框架CAGradientLayer
– 如果布局改变 – 例如旋转设备,该框架可能变得无效。
为了处理这个问题,我在child_viewController
使用了viewDidLayoutSubviews
– 将gradientView
CAGradientLayer
中的CAGradientLayer
的框架保持为正确。
它的工作,但不舒服。 (有没有更好的办法?)