2010-10-13 28 views
6

Tôi có một UINavigationController với hai UIViewControllers trên nó (A và B). Từ A, tôi đẩy B lên ngăn xếp. Sau đó, người dùng định hướng lại thiết bị. Tôi cần di chuyển một số thứ xung quanh màn hình (các nút, v.v.) để hiển thị theo hướng mới trên A.Thay đổi hướng UIViewController trong ngăn xếp UINavigationController

Tôi thấy rằng -shouldAutorotateToInterfaceOrientation được gọi trên cả A và B (và trả về CÓ). Nhưng -will/-didRotateFromInterfaceOrientation chỉ nhận được gọi trên ViewController nhìn thấy được (B). Khi B được bật ra khỏi ngăn xếp, A được hiển thị theo hướng mới (chính xác) nhưng không có nút nào được di chuyển khi cần.

Để giải quyết điều này, tôi thấy mình thực hiện các mô hình sau:

trong tập tin tiêu đề:

@interface A : UIViewController { 
    // ... 
    UIInterfaceOrientation layoutOrientation; 
} 
// ... 
- (void)orientationChanged; 
@end 

trong file .m:

- (void)viewDidLoad { 
    // ... 
    layoutOrientation = self.interfaceOrientation; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    // ... 
    if (layoutOrientation != self.interfaceOrientation) { 
     [self orientationChanged]; 
    } 
} 

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    [self orientationChanged]; 
} 

- (void)orientationChanged { 
    // move my buttons 
    layoutOrientation = self.interfaceOrientation; 
} 

Về cơ bản, tôi đang kiểm tra để xem nếu định hướng thay đổi trong -viewWillAppear và làm công việc để cập nhật giao diện người dùng ở đó nếu cần. Nó hoạt động tốt, nhưng điều này có vẻ (a) tẻ nhạt, và (b) rất nhiều mã trùng lặp giữa các lớp khác nhau của tôi như A. Tôi có thể sửa chữa (b) bằng cách di chuyển mã đến một siêu lớp phổ biến, nhưng điều này vẫn có vẻ giống như một cái gì đó Tôi không nên làm.

Có cách nào tốt hơn để di chuyển các nút của tôi xung quanh trên các chế độ xem không nằm trên cùng trên ngăn điều hướng không? Quan điểm của tôi đến từ .xibs nếu có điều gì đó trong IB tôi cần kiểm tra. Tôi có nên chỉ thiết kế quan điểm của mình sao cho họ không cần phải di chuyển các nút xung quanh khi định hướng thay đổi?

Cảm ơn!

+0

Mike, tôi có tình huống tương tự. Nhưng, trong phương pháp orientationChanged của tôi, tôi có một số tính toán phụ thuộc vào khung nhìn. Chế độ xem khung cho mỗi hướng được đặt do tự động lấy mặt nạ và trong chế độ xemWillAppear: khung Chế độ xem không được đặt cho hướng mới. Do đó, tính toán của tôi là sai. Nhưng, tôi không thể xử lý tính toán này trong viewDidAppear vì người dùng có thể quan sát quá trình chuyển đổi của các phần tử giao diện người dùng (được tính toán). – spd

Trả lời

1

Tôi thích bố cục càng nhiều càng tốt trong -layoutSubviews; có nhiều cách khác nhau để phát hiện định hướng nhưng tôi chỉ so sánh bounds.size.width với bounds.size.height.

willAnimateRotationToInterfaceOrientation:duration: là nhiều hơn cho hoạt ảnh "đặc biệt" như trượt chế độ xem ra phía dưới và từ bên cạnh.

Kết hợp điều này với bố cục trong một ngòi là tẻ nhạt. Gần đây, tôi vừa chế nhạo giao diện người dùng chân dung trong ngòi cho đến khi nó hoạt động đủ tốt và sau đó viết mã tương đương để làm điều tương tự nhưng cũng hỗ trợ cảnh quan.

+0

Hrm, tôi hy vọng sẽ sử dụng IB càng nhiều càng tốt, nhưng điều này mang lại cho tôi một cái gì đó khác để thử nghiệm. Cảm ơn! –

+0

IB rất hay để thực hiện điều gì đó nhanh chóng hoặc để thiết lập bộ điều khiển thanh/nav ban đầu của ứng dụng. Khi bạn gặp phải bất kỳ điều gì phức tạp (bố cục iPad và iPhone, các hàng trông khá phong phú ở 320, 480, 768 và 1024 px, i18n), tôi đã thấy rằng việc thực hiện nó dễ dàng hơn trong mã; quản lý một bibillion nibs là một nỗi đau (quản lý iPad vs iPhone là đã đủ xấu!). Đừng bận tâm rằng tải nib chậm; có lẽ lý do tại sao Apple thêm UINib (nó deserializes nó một lần, vì vậy bạn có thể tạo cùng một tế bào bảng nhiều lần một cách nhanh chóng). –

1

Tôi đã giải quyết bằng cách triển khai các thay đổi-UI cần thiết trong chế độ xemDidAppear. Trong trường hợp của tôi, tôi chỉ cần gọi willRotateToInterfaceOrientation.

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

    [self willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
} 
+0

trông đẹp hơn nếu bạn làm điều đó trong viewWillAppear – TigerCoding

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