CALayer IOS上的自动布局约束

nil*_*ash 73 calayer ios autolayout

嗨,我正在开发iPhone应用程序,我试图为edittext设置一个边框.我是按照以下方式做到的:

 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];
Run Code Online (Sandbox Code Playgroud)

我对IB中的edittext设置了一些约束,这样当我旋转设备时,它会根据它调整文本字段的宽度.我的问题是调整edittext的宽度而不是调整我为编辑文本设置的CALayer的宽度.所以我想我必须为我的CALayer项目设置一些约束.但我不知道该怎么做.有人知道吗?需要帮忙.谢谢.

Dai*_*jan 119

整个自动化业务是特定于视图的.图层不会自动调整大小.

您需要做的 - 在代码中 - 是自己调整图层大小

例如

在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;
}
Run Code Online (Sandbox Code Playgroud)

或者在你可以使用的自定义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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果通过自动布局约束调整拥有图层的视图,则此解决方案不起作用.在这种情况下,边界和框架属性不会反映由约束确定的实际边界/框架.有什么建议? (17认同)
  • @AlfieHanssen他们确实反映了实际的框架和界限.LayoutSubviews就是这么做的.您也可以在ViewDidAppear之后触发.还调用layoutIfNeeded,InvalidateIntrinsic等... (3认同)
  • 当您在视图上使用 layoutIfNeeded 为自动布局约束设置动画时,这也不起作用,该视图具有一些应反映视图框架的子图层。 (2认同)

ara*_*_86 8

检查此解决方案.使用KVO,路径为"YourView.bounds",如下所示.

self.addObserver(self, forKeyPath: "YourView.bounds", options: .New, context: nil)
Run Code Online (Sandbox Code Playgroud)

然后按照下面的说明处理它.

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)
    }
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅以下链接.

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


pck*_*ill 7

根据这个答案,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;
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我实现了自定义视图的layoutSubviews方法。在此方法中,我只是更新每个子图层的框架以匹配子视图图层的当前边界。

-(void)layoutSubviews{
      sublayer1.frame = self.layer.bounds;
}
Run Code Online (Sandbox Code Playgroud)

  • 至少叫超级 (7认同)

Mar*_*Uma 5

我用虚线边框创建时的解决方案

class DashedBorderView: UIView {

   let dashedBorder = CAShapeLayer()

   override init(frame: CGRect) {
       super.init(frame: frame)
       commonInit()
   }

   required init?(coder aDecoder: NSCoder) {
       super.init(coder: aDecoder)
       commonInit()
   }

   private func commonInit() {
       //custom initialization
       dashedBorder.strokeColor = UIColor.red.cgColor
       dashedBorder.lineDashPattern = [2, 2]
       dashedBorder.frame = self.bounds
       dashedBorder.fillColor = nil
       dashedBorder.cornerRadius = 2
       dashedBorder.path = UIBezierPath(rect: self.bounds).cgPath
       self.layer.addSublayer(dashedBorder)
   }

   override func layoutSublayers(of layer: CALayer) {
       super.layoutSublayers(of: layer)
       dashedBorder.path = UIBezierPath(rect: self.bounds).cgPath
       dashedBorder.frame = self.bounds
   }
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

42255 次

最近记录:

6 年,1 月 前