2010-09-24 32 views
5

Tôi có một tình huống, tôi đã tạo hai ngòi khác nhau, một ở Chế độ Chân dung và một ở chế độ Phong cảnh. Tôi đã có rất nhiều thiết kế trong quan điểm như vậy, tôi đã phải lựa chọn cho hai ngòi khác nhau. Bây giờ, tôi muốn chuyển đổi các ngòi như giao diện quay theoMuốn sử dụng các ngòi ngách cho các định hướng giao diện iphone khác nhau

viewController chung

để tôi có thể giữ lại các giá trị điền và trạng thái của các điều khiển tôi có trong giao diện.

Ngay bây giờ tôi đang sử dụng

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Override to allow orientations other than the default portrait orientation. 
if(interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight){ 
    [self initWithNibName:@"LandscapeNib" bundle:nil]; 
}else if(interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown){ 
    [self initWithNibName:@"PortraitNib" bundle:nil]; 

} 


return YES; 

}

nhưng nó không làm thay đổi NIB, nó cho thấy ngòi tải ban đầu. Tôi có thể đoán nó đang tải nhưng không hiển thị vì nib ban đầu đã được hiển thị, không bị xóa. Tôi không thể tìm thấy giải pháp làm việc với nhiều ngòi với một bộ điều khiển xem phổ biến để tôi có thể dễ dàng xử lý các chức năng của các điều khiển?

Trả lời

2

Bạn không thể tự khởi động lại khi đã được khởi tạo.

Khi quay, bạn sẽ cần phải:

  1. Sử dụng loadNibNamed:owner:options: để tải ngòi bằng tay vào một NSArray. (Xem the documention).
  2. Đặt self.view đối tượng ở chỉ mục 0 của mảng đó.
+0

Ngay cả khi điều này có thể hoạt động, tôi không khuyên bạn thay thế chế độ xem của bộ điều khiển. Nghe có vẻ bẩn thỉu, giới thiệu tình huống dễ vỡ, nơi nó trở nên dễ mắc lỗi trong việc giải phóng và giữ đồ vật đúng cách. – Michal

+0

Trên thực tế, thay thế chế độ xem bộ điều khiển sẽ tốt hơn nhiều nếu người dùng dự kiến ​​sẽ xoay thiết bị lần nữa. Nó không sử dụng nhiều bộ nhớ, cộng với việc quay sẽ nhanh hơn. Bên cạnh đó nếu cả hai khung nhìn là các đối tượng lớp, chúng có thể được deallocated và phát hành với bộ điều khiển khung nhìn. – MishieMoo

5

shouldAutorotateToInterfaceOrientation: chỉ cần trả về bằng CÓ hoặc KHÔNG. Theo kinh nghiệm của tôi, nó không phải là một ý tưởng tốt để làm bất kỳ xử lý mở rộng ở đây. Từ các tài liệu:

triển khai của bạn của phương pháp này đơn giản nên return YES hoặc NO dựa trên giá trị trong tham số interfaceOrientation. Không được cố gắng nhận giá trị của giao diện Tài sản sở hữu hoặc kiểm tra giá trị định hướng được báo cáo bởi lớp UIDevice. Bộ điều khiển chế độ xem của bạn có khả năng hỗ trợ định hướng cho hoặc không.

Một nơi tốt hơn để tải ngòi của bạn để đáp ứng với một xoay thiết bị sẽ được

willRotateToInterfaceOrientation:duration: hoặc didRotateToInterfaceOrientation:

6

Bạn nên tạo một view-controller đặc biệt cho chế độ phong cảnh, và trình bày nó modally khi thiết bị quay. Để được thông báo khi thiết bị quay, hãy đăng ký UIDeviceOrientationDidChangeNotification thông báo.

Đối với các chế độ xem phức tạp như vậy cần được trình bày khác nhau theo chiều dọc và ngang, đây là cách được Apple khuyên dùng.Đọc vào đây để biết thêm chi tiết:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/BasicViewControllers/BasicViewControllers.html#//apple_ref/doc/uid/TP40007457-CH101-SW26

Dưới đây là một đoạn trích từ tài liệu của Apple. Đăng ký thông báo trong init hoặc awakeFromNib của bạn:

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(orientationChanged:) 
          name:UIDeviceOrientationDidChangeNotification 
          object:nil]; 

và trong orientationChanged giới thiệu phong cảnh của bạn view-controller modally, hoặc bỏ qua nó, tất cả theo luân phiên hiện tại:

- (void)orientationChanged:(NSNotification *)notification 
{ 
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation; 
    if (UIDeviceOrientationIsLandscape(deviceOrientation) && 
     !isShowingLandscapeView) 
    { 
     [self presentModalViewController:self.landscapeViewController 
           animated:YES]; 
     isShowingLandscapeView = YES; 
    } 
    else if (deviceOrientation == UIDeviceOrientationPortrait && 
      isShowingLandscapeView) 
    { 
     [self dismissModalViewControllerAnimated:YES]; 
     isShowingLandscapeView = NO; 
    } 
} 
-2

tôi cần phải làm như vậy cho ứng dụng của riêng tôi và cuối cùng đã kết thúc với một lớp UIAutoRotateView cụ thể sẽ xử lý điều đó cho bạn.

xem giải thích here

Hy vọng điều này sẽ hữu ích.

+1

Câu trả lời chỉ chứa liên kết được coi là thực hành không tốt (http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers). Vui lòng tóm tắt nội dung ở đây (không sao chép/dán) để câu trả lời có thể tự đứng vững. Nếu bạn không chạy nguy cơ câu trả lời của bạn bị xóa, đặc biệt nếu liên kết đã từng chết. Ngoài ra, vui lòng xem lại [khuyến mại # faq] khi liên kết tới blog của riêng bạn. –

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