나는 어떤 경우에는 당신이 호출해야한다는 n8gray의 대답에 추가 할 setNeedsLayout
다음에 layoutIfNeeded
.
예를 들어 하위 뷰의 위치가 복잡하고 autoresizingMask 또는 iOS6 AutoLayout으로 수행 할 수없는 UIView를 확장하는 사용자 정의 뷰를 작성했다고 가정 해 보겠습니다. 을 재정 의하여 사용자 지정 위치 지정을 수행 할 수 있습니다 layoutSubviews
.
예를 들어 contentView
속성 이있는 사용자 지정보기 와 edgeInsets
contentView 주변에 여백을 설정할 수 있는 속성이 있다고 가정 해 보겠습니다 . layoutSubviews
다음과 같이 보일 것입니다.
- (void) layoutSubviews {
self.contentView.frame = CGRectMake(
self.bounds.origin.x + self.edgeInsets.left,
self.bounds.origin.y + self.edgeInsets.top,
self.bounds.size.width - self.edgeInsets.left - self.edgeInsets.right,
self.bounds.size.height - self.edgeInsets.top - self.edgeInsets.bottom);
}
edgeInsets
속성을 변경할 때마다 프레임 변경에 애니메이션을 적용하려면 edgeInsets
다음과 같이 setter 를 재정의하고 setNeedsLayout
뒤에 다음을 호출 해야합니다 layoutIfNeeded
.
- (void) setEdgeInsets:(UIEdgeInsets)edgeInsets {
_edgeInsets = edgeInsets;
[self setNeedsLayout]; //Indicates that the view needs to be laid out
//at next update or at next call of layoutIfNeeded,
//whichever comes first
[self layoutIfNeeded]; //Calls layoutSubviews if flag is set
}
이렇게하면 다음을 수행하면 애니메이션 블록 내에서 edgeInsets 속성을 변경하면 contentView의 프레임 변경이 애니메이션으로 표시됩니다.
[UIView animateWithDuration:2 animations:^{
customView.edgeInsets = UIEdgeInsetsMake(45, 17, 18, 34);
}];
setEdgeInsets 메서드에서 layoutIfNeeded에 대한 호출을 추가하지 않으면 다음 업데이트주기에서 layoutSubviews가 호출되므로 애니메이션 블록 외부에서 호출하는 것과 동일하므로 애니메이션이 작동하지 않습니다.
setEdgeInsets 메서드에서 layoutIfNeeded 만 호출하면 setNeedsLayout 플래그가 설정되지 않았으므로 아무 일도 일어나지 않습니다.