[iphone] CALayers는 UIView의 경계 변경에 따라 크기가 조정되지 않았습니다. 왜?

나는이 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