2013-06-10 1 views
10

매우 간단한 작업에서 이상한 문제가 있습니다. >은 UILabel의 간단한 UIView의 - 우리가이 파단와 부모보기가 위의 예에서장치 회전시 AutoLayout 및 UILabel 크기 조정 애니메이션이 제대로 작동하지 않습니다.

|--------------------------------------| 
|    Parent View    | 
|          | 
||------------------------------------|| 
||    UILabel    || 
||------------------------------------|| 
|          | 
|          | 
||------------------------------------|| 
||    UIView    || 
||------------------------------------|| 
|          | 
|          | 
|--------------------------------------| 

:

나는 문제를 재현하는 아주 작은 설정이 필요합니다. 자동 레이아웃을 사용하여 임 레이아웃 위에 표시된 적용 :

Constraints for UILabel: 
Leading Space to superview = 0 
Trailing Space to superview = 0 
Fixed Height constraint (e.g. 80pt) 
Top Space constraint (e.g. 50pt) 

The UIView subview has the same constraint types (the values for height and top space differs). 

그래서 내가이 설정과 기대, 우리는 공간을 선행 및 후행하는 0이되어야한다는 규정을 모두 파단은 부모의 전체 폭을 채택 할 것입니다. 그래서 상위 뷰의 너비를 변경하면, 정렬 된 상태를 유지하기 위해 하위 뷰의 너비도 변경되어야합니다.

부모보기의 크기가 200x400 pt라고 가정합니다. 내가 빌드하고 세로에서 내 예제를 실행하면 모든 것이 정상적으로 보입니다. 내가 경관으로 회전하면, 모든 것이 여전히 멋지게 보입니다. 상위 뷰 너비와 심지어 하위 뷰 너비가 더 커졌습니다. 내가 다시 세로로 uilabels이 폭 회전 할 때하지만 지금 즉시 애니메이션없이 대상의 폭을 가져옵니다

|--------------------------------------| 
|    Parent View    | 
|          | 
| (immediately has target size)  | 
|   |--------------|   | 
|   | UILabel |   | 
|   |--------------|   | 
|          | 
| (this subview is still    | 
|    animating its width)  | 
| |------------------------------| | 
|-->|   UIView    |<--| 
| |------------------------------| | 
|          | 
|          | 
|--------------------------------------| 

견해는 폭 부모와 UIView의 서브 뷰 폭은 제대로 애니메이션된다. 그 이상한 행동을하는 유일한 uilabel 그리고 그 문제를 일으키는 원인을 찾을 수 없습니다.

+0

계층 구조와 제약 조건을 프로그래밍 방식으로 만들고 있습니까? 이 경우 translatesAutoresizingMaskIntoConstraints를 NO로 설정 했습니까? –

+0

당신이 이것을 알아 냈습니까? 나는 같은 문제를 겪고있다. – user18853

답변

0

문제는 UILabel이 크기를 애니메이션화하지 않지만 텍스트가 움직이지 않는다는 것이 아닙니다. 레이블에 다른 배경색을 지정하면 실제로 애니메이션이 적용된다는 것을 알게되고, 위치로 이동하는 텍스트 만 나타납니다.

이 문제를 해결하는 한 가지 방법은 애니메이션이없는 라벨의 너비를 변경하고 X 포인트로 X를 이동하는 것입니다. 여기서 X는 시작 및 끝 폭의 차이의 절반입니다. 그런 다음 위치의 애니메이션을 적용하면됩니다.

코드에 대한이 방법의 유일한 문제점은 내가 자동 레이아웃을 사용하여 수행 할 수 있다고 생각하지 않는다는 것입니다.

0

제약 조건에 대해 더 많은 사양을 제공해야하지만 이러한 쉬운 UI 요소에 대해서는 UIViewAutoresizing 마스크를 사용하는 것이 좋습니다. 그것들은 훨씬 간단하고 정의가 짧습니다. 귀하의 경우에는 UIViewAutoresizingFlexibleWidth을 사용하십시오.

0

autolayoutstory board에 설정하는 것이 좋습니다. 제약 조건을 설정할 때보기 컨트롤러에서 모든 하위보기가 선택되어 있는지 확인하십시오. 이를 위해 다음을 수행해야합니다 : 메인 뷰 컨트롤러의 전망에

  1. 클릭
  2. 을 눌러 Ctrl+A
  3. 클릭 해결 자동 레이아웃 문제
  4. 선택 뷰 컨트롤러에서 누락 제약 조건을 추가

그러면 제약 조건이 모든 하위 뷰에 설정되고 회전 중에 완벽하게 작동합니다.

1

내 제안은 : 당신이 서브 클래스했다면

부모 뷰가이 - (void)layoutSubviews 사용 상위 뷰를 서브 클래 싱하지 않은 경우

- (void)layoutSubviews { 
    label.frame = CGRectMake(leftInset, labelY, parentView.frame.size.width - leftInset*2, labelHeight); 
    childView.frame = CGRectMake(leftInset, childViewY, parentView.frame.size.width - leftInset*2, childHeight); 
} 

사용할 수 autoresizingMask :

label.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
childView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 
관련 문제