그래서 XCode 6에서 앱을 컴파일 한 후 iOS 8에서 실행할 때만 발생하는 이상한 버그를 발견했습니다 . 프레임을 업데이트 한 후 UITableView
잘못된 내부 치수를 사용합니다.
이제 정확한 상황을 설명하려고합니다. UITableView
측면 이 회전되어 기본적으로 수평 UITableView
. 을 통해 발생합니다 tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
. 이제 변환을 설정하고 프레임을 설정 한 후 모든 것이 정상입니다. 그러나 물론 대부분의 경우 시스템은 부모를 XIB 크기 나 초기화 크기가 아닌 실제 크기로 설정해야하기 때문에 다른 프레임 변경을 부모에게 보냅니다. 그 순간-테이블 뷰를 포함하여 하위 뷰를 릴레이하면 모든 것이 잘못됩니다. 실제로 테이블 뷰의 프레임이 단순히 설정되어 bounds
그 내측있는 ScrollView (8에서는 아이폰 OS를 포함하는 뷰하지만이 UITableView
다른있다 UIScrollView
라는 그 안에 UITableViewWrapperView
. 바와 같이 UITableView
인UIScrollView
그 자체로는 그들이 왜 다른 것이 필요한지 알 수 없습니다 ...) 부모 너비와 같은 "높이"를 사용합니다. 그리고 "높이"는 실제로 width
속성이며 회전 만 가능합니다.
이제 우리는 쉽게 내부의 폭과 관련하여 그들이 버그를 추정 할 수 UIScrollView
부모의 실제 폭 UITableView
아마도 읽기가 될 수있다, .frame.size.width
대신의 .bounds.size.width
. 그러나 이상한 점은의 하위 뷰의 프레임을 조사 할 때 UITableView
모두 좋은 것 같습니다! 그래서 어딘가에 렌더링 문제 일 것입니다.
따라서 셀의 "높이"는 568 대신 320이고 셀의 "너비"는 320으로 설정되어 있기 때문에 상단에 빈 간격이있는 가로 테이블이 남습니다.
이 문제를 겪고있는 다른 사람들 (또는 Apple로부터)의 소식을 듣게되어 매우 기쁩니다.하지만 마침내 해결책을 찾아서 여기에 질문과 함께 게시하여 저와 다른 사람들을 위해 나중에 참조 할 수 있습니다.
따라서 작동하게 한 변경은 다음을 수행하는 대신입니다.
- (void)layoutSubviews
{
tableView.frame = self.bounds;
}
변환을 재설정하고 UITableView가 변환 후 로컬에서 예상 할 경계로 프레임을 설정 한 다음 변환을 설정하고 올바른 프레임을 설정했습니다. 이것은 약간 혼란 스럽지만 여기에 있습니다.
- (void)layoutSubviews
{
if (UIDevice.currentDevice.systemVersion.floatValue >= 8.f)
{
// iOS 8 layout bug! Table's "height" taken from "width" after changing frame. But then if we cancel transform, set width/height to the final width/height, and rotate it and set to the virtual width/height - it works!
CGRect rotatedFrame = self.bounds,
unrotatedFrame = rotatedFrame;
unrotatedFrame.size.width = rotatedFrame.size.height;
unrotatedFrame.size.height = rotatedFrame.size.width;
tableView.transform = CGAffineTransformIdentity;
tableView.frame = unrotatedFrame;
tableView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
tableView.frame = rotatedFrame;
}
else
{
tableView.frame = self.bounds;
}
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다