을 작동 할 :하지 내가 이런 식으로 뭔가를 시도하고
- (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 우선 순위를 설정하지 않습니다 연결된보기가있는 여러 조건에 ...
나는 수직 UIView와 UITableView를 정렬했다. 우선 순위 500과 수직 간격 제한이 모두 0 인 높이 제한이있다. 따라서 앱 시작시 내 UITableView를 숨기고 싶다. – k06a
방금 질문을 업데이트했다. 더 재미있어졌습니다 :) – k06a
@ k06a 우선 순위가 같지만 우선 순위가 1000 미만인 호환되지 않는 제약 조건이있는 경우 어떤 제약 조건이 "승리 할"것인지 확신 할 수 없습니다. 나는 상수도 설정의 타이밍에 따라 "승자"를 바꿀 수있는 모든 종류의 내부 레이아웃을 상상할 수 있지만, 개인적으로 의존하지는 않습니다. IMHO, 제약의 우선 순위를 '일정한'제약 설정 지연으로 즐기는 특이성에 의존하기보다는 예측 가능한 패턴을 보장하도록 할 것입니다. 그것은 당신의 앱을 "미래 보장"할 것입니다. – Rob