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) } 

有关更多信息,请参阅以下链接。

https://theswiftdev.com/2015/03/28/auto-layout-with-layers/

我实现了自定义视图的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的子视图定位UIViewCAGradientLayer框架。

调用子视图gradientView和视图控制器child_viewController

child_viewController是我设置为一种可重用组件的视图控制器。 所以, child_viewControllerview被组成一个父视图控制器 – 调用parent_viewController

当调用child_viewController viewDidLayoutSubviewschild_viewControllerframe尚未设置。

(在这一点上,我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的框架保持为正确。

它的工作,但不舒服。 (有没有更好的办法?)