13

Tôi có bộ điều khiển xem được thiết lập theo chương trình có con UIPageViewController. Điều này sẽ hiển thị các bộ điều khiển xem khác nhau cũng được thiết lập theo lập trình. Các chế độ xem của trình điều khiển chế độ xem này có translatesAutoresizingMaskIntoConstraints được đặt thành YES, nhưng chế độ xem của trình điều khiển chế độ xem trang sử dụng các ràng buộc cho vị trí của chính nó trong trình điều khiển chế độ xem trên cùng.UIPageViewController không thay đổi kích thước bộ điều khiển xem con của nó

Sự cố là khi người dùng xoay thiết bị, trình điều khiển chế độ xem trang sẽ thay đổi kích thước khung của nó nhưng trình điều khiển chế độ xem con của nó thì không. Bởi didRotateFromInterfaceOrientation, khung của nó vẫn còn từ hướng cũ. Tôi đã xác minh rằng các phương thức xoay được gọi trên các bộ điều khiển xem con, khung của chúng không thay đổi.

tôi thiết lập bộ điều khiển xem trang như thế này:

self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
self.pageViewController.view.backgroundColor = [UIColor clearColor]; 
self.pageViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
self.pageViewController.dataSource = self; 
self.pageViewController.delegate = self; 
[self.pageViewController willMoveToParentViewController:self]; 
[self.view addSubview:self.pageViewController.view]; 
[self addChildViewController:self.pageViewController]; 
[self.pageViewController didMoveToParentViewController:self]; 

self.currentPageIndex = 0; 

self.currentPageController = [self pageForIndex:self.currentPageIndex]; 
self.currentPageController.delegate = self; 
[self.pageViewController setViewControllers:@[self.currentPageController] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL]; 

Tôi đã cố gắng kêu gọi setNeedsLayout nhưng đó là một hình ảnh động xoay vụng về và các trang tiếp theo mà tôi vuốt đến cũng không được thay đổi kích cỡ đúng cách.

Tại sao bộ điều khiển chế độ xem trang không thay đổi kích thước bộ điều khiển chế độ xem con của nó và làm cách nào để làm điều này?

Cảm ơn!

+0

Bạn có tìm thấy giải pháp cho vấn đề của mình không? Tôi bị mắc kẹt với cùng một vấn đề. – AlexR

+0

Vấn đề là -didRotateFromInterfaceOrientation trên bộ điều khiển con không bao giờ được gọi. Tôi đã giải quyết nó bằng cách gọi thủ công nó từ bộ điều khiển chế độ xem gốc -didRotateFromInterfaceOrientation. –

+0

Phương pháp trên bộ điều khiển xem clild là gì bạn gọi để xử lý thay đổi định hướng? – Satyam

Trả lời

-1

Thêm chế độ xem của bộ điều khiển trực tiếp vào chế độ xem của bộ điều khiển khác và mong đợi các phương pháp xoay vòng và vòng đời được gọi không phải là chính sách tốt nhất. Tôi cảm thấy việc thêm nó vào hệ thống phân cấp bộ điều khiển có thể hoạt động, nhưng tôi không thể bình luận nhiều về nó.

Tôi đã thử nghiệm với thanh điều hướng thanh tab và UIPageViewController của tôi có các sự kiện cùng với bộ điều khiển đã được hiển thị trong UIPageViewController. Tôi đoán rằng nếu tôi đẩy bộ điều khiển vào một UINavigationController tôi sẽ nhận được kết quả tương tự.

Tôi khuyên bạn nên hiển thị UIPageVIewController của bạn theo cách tiêu chuẩn hơn là thêm chế độ xem vào chế độ xem của bộ điều khiển khác.

+0

Nó không cần thiết mà trang xem điều khiển phải được toàn màn hình luôn luôn. Trên một thiết bị như iPad, nó có thể là một phần của khung nhìn. Và vì vậy nó phải được thực hiện như đã đề cập trong câu hỏi. Hãy sửa tôi nếu có cách nào khác để đạt được nó. – Satyam

6

Trước tiên, hãy thiết lập mọi thứ bằng bố cục tự động, theo lập trình hoặc Bảng phân cảnh. Sau đó, nắm bắt sự thay đổi định hướng trong bộ điều khiển xem cha và buộc khung nhìn của UIPageViewController lại bố trí lại.

Đây là mã làm việc của tôi (iOS 8.0 trở lên). childController1 được thiết lập trên Bảng phân cảnh với tất cả bố cục sử dụng các ràng buộc và được tạo bằng [self.storyboard instantiateViewControllerWithIdentifier:@"ChildControllerId"].

- (void)createPageController 
{ 
... 
    pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
    pageController.dataSource = self; 
    [pageController setViewControllers:@[childController1] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil]; 
    [self addChildViewController:pageController]; 
    [self.view addSubview:pageController.view]; 
    UIView *pageView = pageController.view; 
    pageView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[pageView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(pageView)]]; 
    [pageController didMoveToParentViewController:self]; 
... 
} 
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [pageController.view setNeedsLayout]; 
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; 
} 

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan