2013-06-28 2 views
4

을 작동 할 :하지 내가 이런 식으로 뭔가를 시도하고

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    NSLog(@"%@", self.tableViewHeight); 
    self.tableViewHeight.constant = 0; 
    NSLog(@"%@", self.tableViewHeight); 

    [self.tableView setNeedsUpdateConstraints]; 
    [self.tableView setNeedsLayout]; 
    [self.view setNeedsUpdateConstraints]; 
    [self.view setNeedsLayout]; 
} 

하지만 가끔은이 일 수도 있고, 그렇지 않을 수도있다. 로그에 항상 올바른 메시지가 표시됩니다.

<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00([email protected])] priority:500> 
<NSLayoutConstraint:0x9ebe7a0 V:[UITableView:0xa345a00([email protected])] priority:500> 

왜 이런 일이 발생합니까? UI가 표시되기 전에 NSLayoutConstraints 속성을 변경하는 방법은 무엇입니까?

UPDATE :이 정말 왜 일어나는지

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.tableViewHeight.constant = 0; 
     [self.view setNeedsUpdateConstraints]; 
    }); 
} 

그냥 말해 :이 코드는 (항상하지만 지금 내가 생각하는) 20 배의 20 배를 작동

?

업데이트 2 : 여전히 작동하지 않는 이전 코드처럼

은 같은데하지만이 작동합니다

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    self.topViewHeight.constant += self.tableViewHeight.constant; 
    self.tableViewHeight.constant = 0; 
    [self.view setNeedsUpdateConstraints]; 
} 

UPDATE 3 :

내가 (LIKE 500) EQUAL 우선 순위를 설정하지 않습니다 연결된보기가있는 여러 조건에 ...

답변

1

I noti ce는 500이라는 우선 순위를 가지고 있습니다. 이는 다른 제약 조건을 충족시키기 위해이 제약 조건을 깨고 자한다는 것을 의미합니다. 나는 당신이 가지고있는 다른 제약이 무엇인지 궁금합니다. Interface Builder에서이 작업을 수행하면 모호성을 제거하기 위해 필요한 제약 조건을 추가하는 성가신 경향이 있습니다 (Xcode 4.6.x 이상). 우선 순위가 높은 다른 제약 조건 또는 상단 및 하단 제약 조건이 없는지 확인할 수 있습니다.

결론적으로 constant을 설정하기위한 기술은 괜찮습니다. (생각한 바로는 setNeedsLayout을 사용하는 것으로 충분하다는 것입니다) 문제는 아마도 오래 가지 않을 수있는 다른 제약 조건에 달려있을 것입니다.

이 제한 조건의 우선 순위를 1000으로 변경하면 충돌하는 제약 조건이있는 경우 해당 제약 사항에 대한 오류가 발생하여 문제를 진단하는 데 도움이됩니다. 그러나 그것이 그렇듯이, autolayout에게이 높이 제한이 다른 상충하는 제약 (우선 순위가 같거나 더 높음)에 우선하여 무시된다고 말하고있는 것입니다. 우선 순위를 1000으로 설정하면이 제한 조건을 절대로 무시하지 않아야한다고 말하고있는 것입니다.

+0

나는 수직 UIView와 UITableView를 정렬했다. 우선 순위 500과 수직 간격 제한이 모두 0 인 높이 제한이있다. 따라서 앱 시작시 내 UITableView를 숨기고 싶다. – k06a

+0

방금 ​​질문을 업데이트했다. 더 재미있어졌습니다 :) – k06a

+1

@ k06a 우선 순위가 같지만 우선 순위가 1000 미만인 호환되지 않는 제약 조건이있는 경우 어떤 제약 조건이 "승리 할"것인지 확신 할 수 없습니다. 나는 상수도 설정의 타이밍에 따라 "승자"를 바꿀 수있는 모든 종류의 내부 레이아웃을 상상할 수 있지만, 개인적으로 의존하지는 않습니다. IMHO, 제약의 우선 ​​순위를 '일정한'제약 설정 지연으로 즐기는 특이성에 의존하기보다는 예측 가능한 패턴을 보장하도록 할 것입니다. 그것은 당신의 앱을 "미래 보장"할 것입니다. – Rob

관련 문제