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
'programing' 카테고리의 다른 글
코로나, 폰갭, 티타늄 비교 (0) | 2023.06.02 |
---|---|
잠금 에스컬레이션 - 여기서 무슨 일이 발생합니까? (0) | 2023.06.02 |
ng2 - ng-container 태그와 ng-template 태그의 차이 (0) | 2023.06.02 |
데이터 클래스의 클래스 특성 선언에서 기본값을 변경할 수 없는 이유는 무엇입니까? (0) | 2023.05.28 |
엔티티 개체는 IEentityChangeTracker의 여러 인스턴스에서 참조할 수 없습니다.Entity Framework 4.1에서 엔티티에 관련 개체를 추가하는 동안 (0) | 2023.05.28 |