나는이 UIView
팔에 대해 다른이있는 CALayer
그 레이어에 추가 하위 레이어. 경우 내가보기의 경계 수정 (애니메이션)을, 다음 뷰 자체는 (내가 그것을 확인 축소 backgroundColor
), 그러나 서브 레이어 ‘의 크기는 변경되지 않습니다 .
이것을 해결하는 방법?
답변
Solin이 사용한 것과 동일한 접근 방식을 사용했지만 해당 코드에 오타가 있습니다. 방법은 다음과 같아야합니다.
- (void)layoutSubviews {
[super layoutSubviews];
// resize your layers based on the view's new bounds
mylayer.frame = self.bounds;
}
내 목적을 위해 항상 하위 레이어가 상위 뷰의 전체 크기가되기를 원했습니다. 해당 메소드를 뷰 클래스에 넣으십시오.
답변
iPhone의 CALayer는 레이아웃 관리자를 지원하지 않기 때문에 뷰의 메인 레이어 layoutSublayers
를 모든 하위 레이어의 프레임을 설정하기 위해 재정의하는 사용자 정의 CALayer 하위 클래스로 만들어야한다고 생각합니다 . 또한 +layerClass
새 CALayer 하위 클래스의 클래스를 반환하려면 뷰의 메서드를 재정의해야합니다 .
답변
나는 이것을 UIView에서 사용했습니다.
-(void)layoutSublayersOfLayer:(CALayer *)layer
{
if (layer == self.layer)
{
_anySubLayer.frame = layer.bounds;
}
super.layoutSublayersOfLayer(layer)
}
나를 위해 작동합니다.
답변
나는 같은 문제가 있었다. 사용자 정의보기의 레이어에서 두 개의 하위 레이어를 더 추가했습니다. 하위 레이어의 크기를 조정하기 위해 (사용자 정의보기의 경계가 변경 될 때마다) 사용자 정의보기의 방법 layoutSubviews
을 구현했습니다 . 이 방법 내에서 내 하위 뷰 레이어의 현재 경계와 일치하도록 각 하위 레이어의 프레임을 업데이트합니다.
이 같은:
-(void)layoutSubviews{
//keep the same origin, just update the width and height
if(sublayer1!=nil){
sublayer1.frame = self.layer.bounds;
}
}
답변
2017 년
이 질문에 대한 문자적인 대답 :
“CALayers는 UIView의 경계 변경에 따라 크기가 조정되지 않았습니다. 이유가 무엇입니까?”
그게 좋든 나쁘 든
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
