我有一个UIView
其中大约CALayer
添加了8个不同子层的图层。如果我修改视图的边界(动画),则视图本身会缩小(我用对其进行了检查backgroundColor
),但是子层的大小保持不变。
如何解决呢?
我有一个UIView
其中大约CALayer
添加了8个不同子层的图层。如果我修改视图的边界(动画),则视图本身会缩小(我用对其进行了检查backgroundColor
),但是子层的大小保持不变。
如何解决呢?
Answers:
我使用了与Solin相同的方法,但是该代码中有一个错字。该方法应为:
- (void)layoutSubviews {
[super layoutSubviews];
// resize your layers based on the view's new bounds
mylayer.frame = self.bounds;
}
出于我的目的,我一直希望子图层为父视图的完整大小。将该方法放在您的视图类中。
UITextView
(scrollEnabled = NO)和自动布局对我来说效果不佳。我将一个文本视图固定到其超级视图,该视图又CALayer
在其自身的底部(边框),并且我希望它在文本视图的高度更改时更新边框位置。由于某种原因layoutSubiews
被称为为时已晚(图层位置已设置动画)。
由于iPhone上的CALayer不支持布局管理器,因此我认为您必须将视图的主层设置为自定义CALayer子类,在其中可以覆盖layoutSublayers
所有子层的框架。您还必须重写视图的+layerClass
方法以返回新CALayer子类的类。
我在UIView中使用了它。
-(void)layoutSublayersOfLayer:(CALayer *)layer
{
if (layer == self.layer)
{
_anySubLayer.frame = layer.bounds;
}
super.layoutSublayersOfLayer(layer)
}
为我工作。
CALayerDelegate
的draw(_:in:)
),我只好也呼吁_anySubLayer.setNeedsDisplay()
。然后这对我有用。
我有同样的问题。在自定义视图的层中,我添加了另外两个子层。为了调整子层的大小(每次更改自定义视图的边界时),我实现了layoutSubviews
自定义视图的方法。在此方法中,我只是更新每个子图层的框架以匹配子视图图层的当前边界。
像这样:
-(void)layoutSubviews{
//keep the same origin, just update the width and height
if(sublayer1!=nil){
sublayer1.frame = self.layer.bounds;
}
}
这个问题的字面答案:
是好是坏
needsDisplayOnBoundsChange
默认为false CALayer
。
解,
class CircularGradientViewLayer: CALayer {
override init() {
super.init()
needsDisplayOnBoundsChange = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open func draw(in ctx: CGContext) {
go crazy drawing in .bounds
}
}
确实,我指导您进行此质量检查
https://stackoverflow.com/a/47760444/294884
这说明了关键contentsScale
设置到底是做什么的;您通常需要在设置needsDisplayOnBoundsChange时同样地进行设置。
Swift 3版本
在“自定义”单元格中,添加以下行
首先声明
let gradientLayer: CAGradientLayer = CAGradientLayer()
然后添加以下行
override func layoutSubviews() {
gradientLayer.frame = self.YourCustomView.bounds
}
正如[Ole]所写,CALayer不支持在iOS上自动调整大小。因此,您应该手动调整布局。我的选择是在(iOS 7和更早版本)内调整图层的框架
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
或(从iOS 8开始)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinato
在您的自定义视图中,您需要为自定义图层声明变量,而不是在范围初始化中声明变量。并且只需将其初始化一次,就不要尝试设置null值并重新初始化
类CustomView:UIView { var customLayer:CALayer = CALayer() 覆盖func layoutSubviews(){ super.layoutSubviews() //保护let _fillColor = self._fillColor else {return} initializeLayout() } 私人函式initializeLayout(){ customLayer.removeFromSuperView() customLayer.frame = layer.bounds layer.insertSubview(at:0) } }