2015-09-24 17 views
5

Tôi đã nhận thấy sự thay đổi về cách iOS 9 tải/hiển thị lượt xem so với các phiên bản iOS trước. Dưới đây là một sản phẩm của self.view.frame trong iOS 8.4iOS 9 đã thay đổi hành vi tải chế độ xem

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 64}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

Và đây là giống nhau cho Thông báo iOS 9

viewDidLoad {{0, 0}, {320, 504}} 
viewWillAppear {{0, 0}, {320, 504}} 
viewDidAppear {{0, 64}, {320, 504}} 

rằng trong viewWillAppear phương pháp iOS 9 thất bại trong việc cập nhật các origin của self.view.frame.

Điều này gây ra các sự cố nhất định trong ứng dụng của tôi chẳng hạn như lượt xem ban đầu là vị trí không chính xác.

Có ai biết nếu nó dự định hoặc đó là lỗi không? Và có lẽ một sửa chữa nhanh chóng?

+0

Tại sao sự thay đổi này sẽ là một vấn đề đối với bạn ? Các bài đánh giá phải được định vị dựa trên các giới hạn, không phải khung, của chế độ xem gốc. Điều đó sẽ không khác gì ở đây. – rmaddy

+0

Điểm tốt, chỉ tôi đang xử lý vị trí của một 'UITabBar' (hiển thị trong một số màn hình, ẩn trong những người khác), mà không phải là một subview của' self.view'. Bên cạnh đó, 'iOS 9' không cập nhật kích thước khung hình cũng như nguồn gốc. – artooras

+0

Kết quả bạn hiển thị cho biết kích thước khung nhìn đã được cập nhật. Đó là 504 trong cả hai phiên bản iOS. – rmaddy

Trả lời

1

Tôi tìm thấy thay đổi tương tự trong iOS 9 so với các phiên bản iOS trước: trong chế độ xemWillAppear, self.view.frame và self.view.bounds chỉ hiển thị kích thước mặc định được sử dụng trong ngòi thay vì kích thước thực sự được sử dụng khi chạy. Điều này có nghĩa là, ví dụ: nếu nib của bạn có chiều rộng mặc định 320 nhưng bạn chạy nó trên iPhone 6, chiều rộng sẽ được báo cáo không chính xác là 320 thay vì 375.

Bạn có thể sử dụng [[UIScreen mainScreen] bounds] , như được đề xuất trong các nhận xét cho câu hỏi, nhưng điều đó sẽ chỉ hoạt động nếu lượt xem của bạn luôn lấp đầy màn hình. Nếu bạn có thiết kế chia màn hình trên iPad và bạn cần biết chiều rộng màn hình thực tế của một chế độ xem riêng lẻ, nó không có sẵn trong chế độ xemWillAppear.

Bạn có thể sử dụng viewWillLayoutSubviews thay vì viewWillAppear, vì khung và giới hạn được đặt chính xác tại thời điểm đó. Tuy nhiên, điều này không được gọi mỗi khi một lượt xem xuất hiện, chỉ khi lần đầu xuất hiện, do đó hành vi ứng dụng của bạn sẽ thay đổi đôi chút.

Tôi đang sử dụng một sự kết hợp của viewWillAppear và viewWillLayoutSubviews, cùng với một biến thể hiện mới, để nhân rộng các hành vi trước iOS 9 trong iOS 9:

@synthesize sizingReady; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // set a flag telling us whether the view size is available 
    // this is needed in iOS 9 because the view size isn't updated in viewWillAppear yet 
    self.sizingReady = FALSE; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // don't do anything until the view size is available, which doesn't happen until viewWillLayoutSubviews in iOS 9 
    if (!self.sizingReady) { 
     return; 
    } 

    [super viewWillAppear:animated]; 

    // your code goes here 
} 

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 

    if (!self.sizingReady) { 
     self.sizingReady = TRUE; 
     [self viewWillAppear:TRUE]; 
    } 
} 
0

bạn có thể phương pháp swizzling viewWillAppear:, và sử dụng màn hình giới hạn

 


- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    self.view.frame = [UIScreen mainScreen].bounds; 
} 

 

hoặc

 


- (void)viewDidLoad:(BOOL)animated { 
    [super viewDidLoad:animated]; 

    self.view.frame = [UIScreen mainScreen].bounds; 
} 

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