답변:
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는 레이아웃 관리자를 지원하지 않기 때문에 뷰의 메인 레이어 layoutSublayers
를 모든 하위 레이어의 프레임을 설정하기 위해 재정의하는 사용자 정의 CALayer 하위 클래스로 만들어야한다고 생각합니다 . 또한 +layerClass
새 CALayer 하위 클래스의 클래스를 반환하려면 뷰의 메서드를 재정의해야합니다 .
나는 이것을 UIView에서 사용했습니다.
-(void)layoutSublayersOfLayer:(CALayer *)layer
{
if (layer == self.layer)
{
_anySubLayer.frame = layer.bounds;
}
super.layoutSublayersOfLayer(layer)
}
나를 위해 작동합니다.
CALayerDelegate
's 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
}
}
이 QA로 안내합니다.
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 값을 설정하고 다시 초기화하지 마십시오.
class CustomView : UIView { var customLayer : CALayer = CALayer () func layoutSubviews () { super.layoutSubviews () // 가드 let _fillColor = self._fillColor else {return} initializeLayout () } private func initializeLayout () { customLayer.removeFromSuperView () customLayer.frame = layer.bounds layer.insertSubview (at : 0) } }