UITableView
iOS 8 에서 실행 중이며 스토리 보드의 제약 조건에서 자동 셀 높이를 사용하고 있습니다.
내 셀 중 하나에 하나가 포함되어 있으며 UITextView
사용자 입력을 기반으로 수축 및 확장해야합니다. 텍스트를 축소 / 확장하려면 탭하십시오.
텍스트 뷰에 런타임 제약 조건을 추가하고 사용자 이벤트에 대한 응답으로 제약 조건의 상수를 변경 하여이 작업을 수행합니다.
-(void)collapse:(BOOL)collapse; {
_collapsed = collapse;
if(collapse)
[_collapsedtextHeightConstraint setConstant: kCollapsedHeight]; // 70.0
else
[_collapsedtextHeightConstraint setConstant: [self idealCellHeightToShowFullText]];
[self setNeedsUpdateConstraints];
}
내가 할 때마다 tableView
업데이트로 포장 하고 전화 [tableView setNeedsUpdateConstraints]
:
[tableView beginUpdates];
[_briefCell collapse:!_showFullBriefText];
[tableView setNeedsUpdateConstraints];
// I have also tried
// [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
// with exactly the same results.
[tableView endUpdates];
이 작업을 수행하면 셀이 확장되고 애니메이션이 적용되지만 제약 조건 경고가 표시됩니다.
2014-07-31 13:29:51.792 OneFlatEarth[5505:730175] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>",
"<NSLayoutConstraint:0x7f94dced2260 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...']-(15)-| (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced2350 V:|-(6)-[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'] (Names: '|':UITableViewCellContentView:0x7f94de5773a0 )>",
"<NSLayoutConstraint:0x7f94dced6480 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7f94de5773a0(91)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7f94dced2b60 V:[UITextView:0x7f94d9b2b200'Brief text: Lorem Ipsum i...'(388)]>
388은 내 계산 높이이며, 다른 제약 조건 UITextView
은 Xcode / IB의 광산입니다.
마지막 것은 나를 귀찮게합니다- UIView-Encapsulated-Layout-Height
셀이 처음 렌더링 될 때 계산 된 셀 높이 라고 생각합니다 -( UITextView
높이를> = 70.0으로 설정) 그러나이 파생 제약 조건이 업데이트 된 사용자 cnstraint.
더 나쁜 것은 레이아웃 코드가 높이 제한을 위반하려고한다고하지만 셀 높이를 다시 계산하지 않고 원하는대로 모든 것을 그립니다.
그렇다면 NSLayoutConstraint
UIView-Encapsulated-Layout-Height
(자동 셀 크기 조정을 위해 계산 된 높이라고 생각합니다) 무엇이고 깨끗하게 다시 계산하도록하려면 어떻게해야합니까?
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleHeight;
. 처음에 자동 크기 조정 마스크를 설정하면 마지막 제약 조건이 추가되지 않습니다. 이 솔루션을 여기에서 찾았습니다 : github.com/wordpress-mobile/WordPress-iOS/commit/…
<rect key="frame" x="0.0" y="0.0" width="600" height="110"/>
의 정의에 줄이 누락 되어 이것이 IB 버그라고 생각하게 만드는 것입니다 . 어쨌든 적어도 내 것이 었습니다.