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

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

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

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

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



답변

Uli가 아래에 언급했듯이 적절한 방법 layoutSubviews은 imageViews를 재정의 하고 레이아웃하는 것입니다.

어떤 이유로 하위 클래스를 만들고을 재정의 할 수없는 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:
    }
}


답변

A의 UIView서브 클래스, 부동산 전문가들은 사용할 수 있습니다 :

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

서브 클래 싱없이 스마트 키 경로를 사용한 키-값 관찰 은 다음을 수행합니다.

var boundsObservation: NSKeyValueObservation?

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


답변

UIView의 하위 클래스를 만들고 layoutSubview를 재정의합니다.


답변

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) 프레임

방법. 뷰의 프레임 (즉, 크기)이 변경 될 때 호출되는 메서드입니다. 다음과 같이하십시오.

- (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아이폰 OS가 반드시 호출하지 않도록, setFrame:.


답변

UIViewController 인스턴스에있는 경우 재정의 viewDidLayoutSubviews가 트릭을 수행합니다.

override func viewDidLayoutSubviews() {
    // update subviews
}