programing

UIView 크기 조정 이벤트가 있습니까?

powerit 2023. 6. 2. 21:20
반응형

UIView 크기 조정 이벤트가 있습니까?

이미지 보기의 행과 열이 있는 보기가 있습니다.

이 보기의 크기가 조정되면 이미지 보기 위치를 재정렬해야 합니다.

이 보기는 크기가 조정되는 다른 보기의 하위 보기입니다.

이 보기의 크기가 조정되는 시기를 탐지할 수 있는 방법이 있습니까?

Uli가 아래에서 언급했듯이, 그것을 하는 적절한 방법은 재정의하는 것입니다.layoutSubviews및 이미지 보기를 레이아웃합니다.

어떤 이유로 하위 분류 및 재정의할 수 없는 경우layoutSubviews관찰의bounds좀 더러울 때도 효과가 있어야 합니다.더 나쁜 것은 관찰과 관련된 위험이 있다는 것입니다. Apple은 KVO가 UIKit 클래스에서 작동한다고 보장하지 않습니다.여기에서 Apple 엔지니어와의 토론을 읽어 보십시오.연결된 개체는 언제 해제됩니까?

원답:

키 값 관찰을 사용할 수 있습니다.

[yourView addObserver:self forKeyPath:@"bounds" options:0 context:nil];

구현:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if (object == yourView && [keyPath isEqualToString:@"bounds"]) {
        // do your stuff, or better schedule to run later using performSelector:withObject:afterDuration:
    }
}

인어UIView하위 클래스, 속성 관찰자를 사용할 수 있습니다.

override var bounds: CGRect {
    didSet {
        // ...
    }
}

하위 분류 없이 스마트 경로를 사용한 키 값 관찰은 다음과 같은 작업을 수행합니다.

var boundsObservation: NSKeyValueObservation?

func beginObservingBounds() {
    boundsObservation = observe(\.bounds) { capturedSelf, _ in
        // ...
    }
}

UIView의 하위 클래스를 만들고 레이아웃을 재정의합니다.Subview

Swift 4 keypath KVO -- 이것이 자동 회전을 감지하고 iPad 측면 패널로 이동하는 방법입니다.일은 어떤 관점에서도 작동해야 합니다.UIView의 레이어를 관찰해야 했습니다.

private var observer: NSKeyValueObservation?

override func viewDidLoad() {
    super.viewDidLoad()
    observer = view.layer.observe(\.bounds) { object, _ in
        print(object.bounds)
    }
    // ...
}
override func viewWillDisappear(_ animated: Bool) {
    observer?.invalidate()
    //...
}

UIView의 하위 클래스를 생성하고 다음을 재정의할 수 있습니다.

setFrame:(CGRect)프레임

method. 뷰의 프레임(즉, 크기)이 변경될 때 호출되는 메서드입니다.다음과 같은 작업을 수행합니다.

- (void) setFrame:(CGRect)frame
{
  // Call the parent class to move the view
  [super setFrame:frame];

  // Do your custom code here.
}

꽤 오래되었지만 여전히 좋은 질문입니다.Apple의 샘플 코드와 일부 개인 UIView 하위 클래스에서는 다음과 같이 setBounds를 재정의합니다.

-(void)setBounds:(CGRect)newBounds {
    BOOL const isResize = !CGSizeEqualToSize(newBounds.size, self.bounds.size);
    if (isResize) [self prepareToResizeTo:newBounds.size]; // probably saves 
    [super setBounds:newBounds];
    if (isResize) [self recoverFromResizing];
}

오버라이드setFrame:좋은 생각이 아닙니다. frame에서 파생됨center,bounds,그리고.transform그래서 iOS는 반드시 전화하지 않을 것입니다.setFrame:.

UIViewController 인스턴스에 있는 경우 재정의viewDidLayoutSubviews요령을 터득합니다.

override func viewDidLayoutSubviews() {
    // update subviews
}

언급URL : https://stackoverflow.com/questions/4000664/is-there-a-uiview-resize-event

반응형