iOS 7 및 8에서 동적으로 크기가 조정 된 셀을 사용하여 테이블 뷰를 작성하는 데 어려움을 겪고 있습니다. 다른 "조정", "해결 방법"을 사용하여 제작할 수있는 iOS 7과 8 사이에서 ("깨진 레이아웃 방법"으로) 여기에서 찾을 수 있습니다. 그러나 결국 레이아웃 시스템이 사용자 지정 제약 조건 중 하나를 "복구"하기 때문에 iOS 7 또는 iOS 8 (둘 다 아닌 경우)에서 일부 또는 모든 셀의 내용이 잘못 정렬됩니다.iOS 7 및 iOS 8의 동적 UITableViewCell 높이
기본적으로 세 가지 유형의 콘텐츠가 있습니다. 그리고 위의 테이블보기뿐만 아니라이 내용을 UIView
의 세 하위 클래스로 래핑했습니다. SummaryView
s 테이블 뷰의 경우 UITableViewCell
의 세 하위 클래스를 만들고 각각이 SummaryView
을 contentView
에 따라 추가하고 self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight
을 설정합니다. updateViewConstraints
에 나는 일반적으로 tableView:estimatedHeightForRowAtIndexPath:
에서
- (void)updateConstraints
{
// ...removed custom constraints before
NSDictionary *views = NSDictionaryOfVariableBindings(_summaryView);
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_summaryView]-|"
options:0
metrics:nil
views:views]
toView:self.contentView];
[super updateConstraints];
}
내가 내용의 유형에 따라 정적 추정치를 반환 ... 이전에 추가되었을 수있는 모든 "내"제약 조건을 제거 할. 내가의 방식으로 "프로토 타입"세포를 사용 tableView:heightForRowAtIndexPath:
에서 ... 여기 보통 디버거 나누기 UIViewAlertForUnsatisfiableConstraints
에 ([prototypeCell layoutIfNeeded]
에) <NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>
이 제약의 나머지 부분과 충돌로
// ..set content on prototype cell before
[prototypeCell setNeedsUpdateConstraints];
[prototypeCell layoutIfNeeded];
CGSize size = [prototypeCell systemLayoutSizeFittingSize:UILayoutFittingExpandedSize];
return size.height;
.
그래서 나는 셀의 내용을 적용하기 전에 ...
- 테이블 뷰의 사용
tableView:estimatedHeightForRowAtIndexPath:
을 구현하지
viewDidLoad
- ...
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { cell.contentView.frame = cell.bounds; cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin; }
에서
tableView.rowHeight = UITableViewAutomaticDimension
설정 ... 시도 레이아웃 계산하기 - 세포 초기화시
self.contentView.bounds = CGRectMake(0.0, 0.0, 1000, 1000);
을 수행 중 - 아마도 지금 당장 이틀 동안은 기억할 수없는 다른 것들이있을 것입니다.
불만족스러운 제약 조건에 대해 불평하지 않는 변형을 구현하면 항상 레이아웃이 엉망입니다. 그리고 비록 "default"<NSLayoutConstraint:0x17409f180 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x17019f070(44)]>
제약 조건을 설정하지 않는 테이블 뷰를 얻었지만 제약 조건 세트는 (tableView:heightForRowAtIndexPath:
에 의해 반환 된 높이를 기준으로) 레이아웃 시스템에 적합하지 않습니다.
이 게시물은 최후의 수단입니다. 구체적인 클래스의 제약이 없다면 다시 확인할 수 없다는 것을 알고 있습니다. 그러나 이러한 뷰를 문제없이 테이블 뷰 외부에서 사용할 수 있으므로 하위 뷰의 제약 조건의 문제가되어서는 안됩니다.
모든 뷰 요소의 크기를 수동으로 ([UIScreen mainScreen].bounds
기준) 계산하고 모든 서브 뷰에 직접 (너비와 높이로) 설정해야 할 것 같습니다. 그래서 저는 셀의 구체적인 높이를 얻을 수 있고 contentView
의 프레임을 수동으로 설정할 수 있습니다. 그것은 레이아웃 코드를 현저하게 엉망으로 만든다.
감사합니다, 결국 가브리엘
잘못된 경로에있는 셀의 높이는'-tableView : heightForRowAtIndexPath :'메서드를 통해 반환하는 값을 기반으로합니다. 화면의 실제 높이를 정의합니다. 자동 레이아웃이나 auto-resizemask로 놀아도 도움이되지 않습니다. – holex
@ 홀렉스 사냥 명성 이요? ** A ** : _correct_ 경로가 무엇인지에 대해 나에게 (그리고 다른 사람들에게) 가르쳐 주시기 바랍니다. ** B ** :'tableView : heightForRowAtIndexPath'가 무엇인지 의심의 여지가 없다고 생각합니다. ** C ** : 자동 레이아웃으로 _ 주위를 둘러보고 있지 않습니다. 실제로 사용하고 있습니다. ** D ** :'autoresizingMask'로 _playing_하면 다른 사람들을 도왔습니다. http://stackoverflow.com/a/19154287/981728. – dergab