어떤 경우에는 setNeedsLayout
과 layoutIfNeeded
을 호출해야하는 n8gray의 대답을 추가하고 싶습니다.
하위보기의 위치가 복잡하고 autoresizingMask 또는 iOS6 AutoLayout으로 수행 할 수없는 UIView를 확장하는 맞춤보기를 작성했다고 가정 해 보겠습니다. 맞춤 위치 지정은 layoutSubviews
을 재정 의하여 수행 할 수 있습니다.
예를 들어, contentView
속성과 edgeInsets
속성이있는 사용자 지정보기를 사용하여 contentView 주위의 여백을 설정할 수 있습니다. layoutSubviews
는 다음과 같이 보일 것이다 :
: 당신이
edgeInsets
속성을 변경할 때마다 프레임 변화를 애니메이션 할 수있게하려면
- (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
세터를 무시하고 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의 프레임 변경이 애니메이션으로 표시됩니다.당신이 setEdgeInsets 방법에 layoutIfNeeded에 대한 호출을 추가하지 않으면 layoutSubviews이 애니메이션 블록 외부에서 호출 동일합니다 다음 업데이트주기에서 호출되는 것이기 때문에
[UIView animateWithDuration:2 animations:^{
customView.edgeInsets = UIEdgeInsetsMake(45, 17, 18, 34);
}];
, 애니메이션이 작동하지 않습니다.
setEdgeInsets 메서드에서 layoutIfNeeded 만 호출하면 setNeedsLayout 플래그가 설정되지 않으므로 아무 일도 발생하지 않습니다.
감사합니다. - 누군가 기꺼이 대답했습니다. 그 동안에는 drawRect를 호출하는 setNeedsDisplay와 contentMode에 대해서도 알아야했습니다. contentMode = UIViewContentModeRedraw만이 뷰의 경계가 변경 될 때 setNeedsDisplay가 호출되도록합니다. 다른 contentMode를 선택하면보기가 크기 조정되거나, 일부 이동되거나, 가장자리로 정렬됩니다. 내 사용자 지정 UITableViewCell 방향 변경 내용을 다시 그리기 싶지 않았다, UIViewContentModeRedraw contentMode 설정할 때까지 경우에만 확장 할 것입니다. – Tarfa
아마 당신의 코드에서 [self.subview1 layoutSubviews]가 [self.subview1 setNeedsLayout]으로 대체되어야한다고 생각합니다. layoutSubviews는 재정의 될 예정이지만 다른보기에서 또는 다른보기로 호출 할 의도가 없습니다. 프레임 워크는 호출 할시기를 결정합니다 (효율성을 높이기 위해 여러 레이아웃 요청을 하나의 호출로 그룹화 함). 또는 뷰 계층의 어딘가에서 layoutIfNeeded를 호출하여 간접적으로 수행합니다. – Tarfa
위의 내용에 대한 수정 : "... layoutSubviews는 자체에서 재정의하거나 호출해야하기 때문에 다른 뷰에서 호출하거나 다른 뷰로 호출 할 수 없습니다." – Tarfa