programing

CALayers는 UIView의 경계 변경에 대해 크기를 조정하지 않았습니다. 왜죠?

starjava 2023. 6. 26. 20:46
반응형

CALayers는 UIView의 경계 변경에 대해 크기를 조정하지 않았습니다. 왜죠?

나는 있습니다UIView약 8개의 다른 것을 가지고 있습니다.CALayer해당 도면층에 하위 도면층이 추가되었습니다.보기의 범위를 수정하면(애니메이션) 보기 자체가 축소됩니다(아래에서 확인).backgroundColor), 그러나 하위 계층의 크기는 변경되지 않습니다.

어떻게 해결합니까?

저는 솔린이 사용했던 것과 같은 접근법을 사용했는데, 그 코드에 오타가 있습니다.방법은 다음과 같습니다.

- (void)layoutSubviews {
  [super layoutSubviews];
  // resize your layers based on the view's new bounds
  mylayer.frame = self.bounds;
}

저는 항상 하위 계층이 상위 보기의 전체 크기가 되기를 원했습니다.그 메소드를 뷰 클래스에 넣습니다.

iPhone의 CALayer는 레이아웃 관리자를 지원하지 않기 때문에 뷰의 메인 레이어를 오버라이드하는 사용자 지정 CALayer 하위 클래스로 만들어야 한다고 생각합니다.layoutSublayers모든 하위 계층의 프레임을 설정합니다.또한 보기를 재정의해야 합니다.+layerClass새 CALayer 하위 클래스의 클래스를 반환하는 메서드입니다.

저는 이것을 UI뷰에서 사용했습니다.

-(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.

스위프트 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 값을 설정하고 다시 시작합니다.


클래스 사용자 정의 보기:UI뷰 {var 사용자 지정 계층:CALayer = CALayer()
func 레이아웃 재정의Subview() {super.layoutSubviews()guardlet _fillColor = self._fillColor 그렇지 않으면 {return}레이아웃 초기화()}private func 초기화Layout()사용자 지정 계층.SuperView에서 제거()customLayer.frame = 레이어입니다.경계layer.subview 삽입(:0)}}

언급URL : https://stackoverflow.com/questions/2504151/calayers-didnt-get-resized-on-its-uiviews-bounds-change-why

반응형