Tôi đang sử dụng iOS 6, UIScrollView phân trang và bố cục tự động thuần túy.Khung hình không phản ánh ràng buộc bố cục tự động sau khi loại bỏ bộ điều khiển chế độ xem
Tóm tắt: Tôi đã tạo bộ điều khiển chế độ xem để cuộn trang nội dung. Một số chế độ xem được tạo và được định cấu hình trong bảng phân cảnh, các chế độ xem khác theo chương trình. Dưới đây là hệ thống phân cấp chế độ xem:
- Main view (storyboard)
- UIScrollView (storyboard)
- content view (programmatically)
- subviews representing pages of content (programmatically)
Các ràng buộc cho chế độ xem cuộn được định cấu hình trong IB. Đây là cách tôi cấu hình các khó khăn cho quan điểm nội dung trong mã:
- (void)viewDidLoad
{
// ABPageScrollerContentView is a subclass of UIView; it overrides intrinsicContentSize; the size is calculated without referencing the scroll view's dimensions
self.contentView = [[ABPageScrollerContentView alloc] init];
self.contentView.translatesAutoresizingMaskIntoConstraints = NO;
[self.pageScrollerView addSubview:self.contentView];
// configure constraints between scroll view and content view...
UIView *contentView = self.contentView;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(contentView);
[self.pageScrollerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|" options:0 metrics:0 views:viewsDictionary]];
[self.pageScrollerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:0 views:viewsDictionary]];
// the content view's subviews are added/removed in the tilePages method (not shown); tilePages is called later in the view controller lifecycle...
}
Nếu người dùng chạm một nút chỉnh sửa, một bộ điều khiển xem được trình bày modally sử dụng một segue trong kịch bản này. Sau khi bộ điều khiển xem bị loại bỏ, hệ thống dường như không thể giải thích được khung của khung nhìn nội dung mặc dù các ràng buộc không thay đổi.
Tôi bỏ qua những điều khiển xem thể hiện trong phương pháp đại biểu sau đây:
- (void)didExitEditPageViewVC:(id)controller
{
// update currently displayed page view from data model...
// logged content view frame = (0, 0; 1020, 460)
[self dismissViewControllerAnimated:YES completion:^{
// logged content view frame = (-170, 0; 1020, 460)
}];
}
Tôi không hiểu làm thế nào các thành phần x xuất xứ của khung thay đổi từ 0 đến -170. Các ràng buộc giống hệt nhau trước và sau khi loại bỏ trình điều khiển khung nhìn.
Dưới đây là khung và các khó khăn ngay trước khi gọi dismissViewControllerAnimated: hoàn thành: Phương pháp:
(lldb) po self.contentView
$0 = 0x1ede2b40 <AEBPageScrollerContentView: 0x1ede2b40; frame = (0 0; 1020 460); layer = <CALayer: 0x1edd6f00>>
(lldb) po self.pageScrollerView.constraints
$1 = 0x1ed076c0 <__NSArrayM 0x1ed076c0>(
<NSLayoutConstraint:0x1ede2980 H:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1eded480 H:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1edecbc0 V:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>,
<NSLayoutConstraint:0x1ede1040 V:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>
)
Dưới đây là khung và các khó khăn sau khi xem trình bày điều khiển tái xuất hiện:
contentView = <AEBPageScrollerContentView: 0x1ede2b40; frame = (-170 0; 1020 460); layer = <CALayer: 0x1edd6f00>>
self.pageScrollerView.constraints =
(
"<NSLayoutConstraint:0x1ede2980 H:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1eded480 H:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1edecbc0 V:|-(0)-[AEBPageScrollerContentView:0x1ede2b40] (Names: '|':UIScrollView:0x1edd3410)>",
"<NSLayoutConstraint:0x1ede1040 V:[AEBPageScrollerContentView:0x1ede2b40]-(0)-| (Names: '|':UIScrollView:0x1edd3410)>"
)
Tại sao khung nội dung của khung nhìn thay đổi bất ngờ? Và tại sao nó không phù hợp với những gì được quyết định bởi những ràng buộc?
Cuộc gọi bị trì hoãn tới hasAmbiguousLayout trả về false một cách đáng ngạc nhiên. Không có ngoại lệ nào được ném ra. Chế độ xem cuộn thậm chí còn cuộn, mặc dù chế độ xem nội dung bị tắt một phần.
Không nơi nào tôi đặt rõ ràng kích thước nội dung của chế độ xem cuộn; Tôi để nó cho hệ thống. Chế độ xem nội dung có kích thước nội tại (kích thước của chế độ xem nội dung có vẻ ổn, đó là nguồn gốc của chế độ xem nội dung là vấn đề).
Độ lệch nội dung của chế độ xem cuộn là giống nhau trước và sau khi loại bỏ trình điều khiển chế độ xem. Tuy nhiên, sự dịch chuyển của thành phần x của nguồn gốc của nội dung xem là tỷ lệ thuận với độ lệch nội dung. Độ lệch nội dung càng lớn thì thành phần x của nguồn gốc của nội dung xem càng âm sau khi bộ điều khiển chế độ xem bị loại bỏ. Và, tại một bù đắp nội dung của "zero", thành phần x là số không. Vì vậy, nếu bộ điều khiển xem phương thức được trình bày trong khi xem trang đầu tiên của nội dung (khi bù đắp nội dung là "không"), khung của khung nhìn nội dung là chính xác khi loại bỏ bộ điều khiển xem. Trường hợp nội dung-offset-of-zero là trường hợp duy nhất trong đó khung của khung nhìn nội dung phản ánh chính xác các ràng buộc của khung nhìn nội dung.
Tôi đã thử chèn cuộc gọi vào bố cụcNếu được thực hiện ở những nơi khác nhau không có kết quả.
Mọi đề xuất?
Clever giải pháp. Tôi thích ý tưởng phân lớp UIScrollView. Dễ dàng để loại bỏ khi sửa chữa đến. Tôi đã nâng cấp dự án của mình lên iOS 7, nhưng tôi đã chuyển sang một phần khác của dự án của mình. Khi tôi quay lại bộ điều khiển chế độ xem này, tôi có thể xóa phiên bản sửa lỗi của mình. – bilobatum