2011-01-16 32 views
8

Ứng dụng của tôi chỉ hỗ trợ định hướng ngang đúng.Chuyển đổi hoạt ảnh không hoạt động chính xác theo hướng ngang

Tôi đang cố chuyển sang chế độ xem của bộ điều khiển chế độ xem, nhưng khi nó thực hiện hoạt ảnh chuyển tiếp (chẳng hạn như cuộn tròn), chế độ xem được xoay 90 độ (vì vậy, trình mô phỏng vẫn ở hướng ngang-phải, nhưng chế độ xem xuất hiện được xoay 90 độ). Khi quá trình chuyển đổi kết thúc, nó sẽ chuyển sang hướng chính xác. Mã của tôi là dưới đây.

- (IBAction)buttonTouched 
{ 
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 

    [UIView transitionFromView:self.view 
         toView:aViewController.view 
         duration:2 
         options:UIViewAnimationOptionTransitionCurlUp 
        completion:NULL]; 
} 

Có vẻ như chế độ xem không hiển thị thông báo "được thay đổi hướng", sau đó thay đổi thành cảnh quan sau khi hoạt ảnh kết thúc. Tôi đã thiết lập nó trong IB để tất cả được đặt ra trong cảnh quan. EDIT: Tôi cũng đã thử thêm một View Controller vào tập tin IB của bản thân và chuyển sang chế độ xem đó (nghĩ rằng có lẽ nó quá gần giữa khởi tạo và chuyển tiếp) nhưng điều tương tự cũng xảy ra.

Trả lời

16

Vâng, lý do chính là self.view (hiện tại "biết" rằng bạn đang ở chế độ ngang) đang được thay thế bằng chế độ xem mới không có thông tin đó. Vì vậy, một trong những suy nghĩ là chỉ cần đặt aViewController.view như là một subView của self.view (giả định rằng aViewController là mờ). Ah, bạn nói, nhưng sau đó tôi bị mất các hình ảnh động đẹp của transitionFromView. Vâng, hãy thử giá trị nice này:

[UIView transitionWithView:self.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       animations:^{ 
        [self.view addSubview:aViewController.view]; 
       } 
       completion:NULL]; 

Nếu vì một lý do nào đó không làm việc cho bạn, người ta xoay sang "dạy" aViewController.view rằng nó thực sự là một cái nhìn cảnh quan:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__)/180.0 * M_PI) 
-(void)setNewViewToLandscape:(UIView*)viewObject { 
    //assumes self.view is landscape and viewObject is portrait 
    [viewObject setCenter:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)]; 
    CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90)); 
    viewObject.transform = cgCTM; 
    viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height); 
} 

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil]; 
[self setNewViewToLandscape:aViewController.view]; 

[UIView transitionFromView:self.view 
        toView:aViewController.view 
        duration:2 
        options:UIViewAnimationOptionTransitionCurlUp 
       completion:NULL]; 

Một điểm bổ sung nhỏ là aViewController của bạn bị rò rỉ, vì vậy bạn nên làm cho nó một thuộc tính được giữ lại của viewController cha.

+0

Wow ... câu trả lời hay. Cảm ơn! – Ned

+0

Câu trả lời thực sự quan trọng, đã lưu lại ngày của tôi! – BootMaker

+0

Lưu ngày của tôi quá, có một lỗi nhỏ trong tùy chọn thứ hai mặc dù: [self setViewToLandscape: aViewController.view]; nên là: [self setNewViewToLandscape: aViewController.view]; sử dụng quy ước đặt tên của bạn. Ngoài ra nếu bộ điều khiển xem mới của bạn ở chế độ ngang chỉ cần trao đổi chiều rộng và chiều cao ở đây: [viewObject setCenter: CGPointMake (self.view.frame.size.width/2, self.view.frame.size.height/2)]; – Dado

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