2010-08-30 11 views
20

Tôi đang cố gắng tạo chuyển đổi giữa hai bản xem trước (view1 và view2). Khi một nút được nhấn, tôi muốn view1 (phía trước) lật và hiển thị view2 (sau). Tôi đã thử cả transitionFromView và transitionWithView. Mỗi công trình - nhưng mỗi công trình đều có vấn đề.Hành vi chuyển đổi bằng cách sử dụng transitionFromView và transitionWithView

chuyển đổiTừ chế độ xem - lật màn hình giám sát (toàn bộ cửa sổ xem lật, không phải các bản phụ). Khi lật này xảy ra - một subview là trên mặt trước của superview trước khi lật, và subview khác là trên mặt sau của flip - như nó phải được. Nhưng tôi không muốn người giám sát lật, chỉ là các cuộc phỏng vấn.

transitionWithView - chỉ lật các bản xem trước - nhưng chế độ xem 'đến' được hiển thị trước khi quá trình chuyển đổi diễn ra.

Bất cứ ai có đề xuất?

-(IBAction) button1action:(id) sender { 

if ([sender tag] == 0) { 

    [UIView transitionFromView:view2 toView:view1 duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    completion:nil]; 
} 

else { 
    [view1 removeFromSuperview];  
    [self.view addSubview:view2]; 
    [UIView transitionWithView:view2 
    duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromRight + 
    UIViewAnimationOptionShowHideTransitionViews 
     animations:^{} 
    completion:nil]; 
} 
} 
+4

Vui lòng đánh dấu câu hỏi bên dưới làm câu trả lời hoặc nhập câu trả lời của riêng bạn để giải quyết vấn đề của bạn nhằm giúp cộng đồng. – Sam

+0

Tại sao anh ta nên đánh dấu câu hỏi là câu trả lời? : D –

Trả lời

26

Bạn cần xóa và thêm các bản xem phụ trong khối hoạt ảnh. Ngoài ra, tôi nghĩ rằng transitionWithView là nghĩa vụ phải có siêu xem như đối số. Tôi nghĩ những gì bạn cần làm để có được quyền này là sử dụng chế độ xem vùng chứa có cùng kích thước với chế độ xem bạn muốn lật.

này được sao chép từ các tài liệu:

[UIView transitionWithView:containerView 
     duration:0.2 
     options:UIViewAnimationOptionTransitionFlipFromLeft 
     animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; } 
     completion:NULL]; 
+0

Điều này dường như không hoạt động – jjxtra

+1

Chế độ xem vùng chứa là khóa. Điều này được kiểm tra và làm việc trên ios6 và ios7 – Jameo

12

tôi đã chạy vào cùng một vấn đề này chính xác, và tôi đồng ý với câu trả lời trước đó. Có vẻ như bạn phải có chế độ xem vùng chứa để tạo hoạt ảnh chuyển tiếp từ một chế độ xem con sang một chế độ xem phụ khác.

Tôi đang sử dụng phương pháp transitionFromView. Để có nền sau hoạt ảnh, bạn cũng sẽ cần một người giám sát với nền cho chế độ xem vùng chứa.

Mã của tôi trông giống như:

[UIView transitionFromView:view1 
         toView:view2 
         duration:0.5 
         options:UIViewAnimationOptionTransitionFlipFromRight | 
           UIViewAnimationOptionAllowUserInteraction | 
           UIViewAnimationOptionBeginFromCurrentState 
        completion:nil]; 
1

tôi đã có yêu cầu tương tự, và thấy nhiều cách tiếp cận - từ việc sử dụng các lớp (mà kết thúc lên rất phức tạp nếu bạn chỉ muốn để đối phó với một UIView) để gợi ý rằng tôi cần một "thùng chứa" để chuyển đổi giữa các chế độ xem phụ. Nhưng nếu bạn chỉ muốn chuyển một thứ gì đó về phía trước, như lật qua thẻ chơi hoặc gạch trò chơi, tôi đã thực hiện một thay đổi một dòng:

(lưu ý: tôi có một mảng UIViews (lát [x] [y ]) trong một lưới (cho một trò chơi) .Tôi có tất cả các imagefilenames của tôi trong các bảng cơ sở dữ liệu/mảng, mà tự động được nạp vào UIImages của UIImageViews. Hình ảnh cho "back" của một thẻ hoặc tile trong một UIImage có tên " tileBackPicImageNM"

do đó, mã của tôi mà chỉ đơn giản trao đổi các hình ảnh phía trước ra cho một hình ảnh của mặt sau là:..

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 

mà hoạt động tốt

nhưng và bây giờ, để hiển thị một hành động lật, đó là:

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 
        } 
        completion:NULL];  

tôi đã thử nghiệm với nhau "duration" thông số - sau đó đã làm cho nó một phao mà tôi đặt trong các thói quen viewDidLoad. Nhanh hơn 0,3 gần như không hiển thị và giá trị 1 hoặc 2 rất chậm ...

Điều này không liên quan đến hai chế độ xem phụ, trường hợp của tôi hữu ích hơn rất nhiều vì tôi không muốn có một vùng chứa chứa thứ bậc quan điểm, v.v ... và ở cấp độ mới v.v. luôn luôn tải lại các mảng ...

5

Khi chạy vào cùng một vấn đề, tôi đồng ý với Eric và Sam: hoặc chuyển đổiWithView hoặc transitionFromView cả hai sẽ thực hiện những gì bạn muốn như được nêu ở trên miễn là bạn tạo chế độ xem vùng chứa kích thước mà bạn muốn lật. Nếu không thì toàn bộ cửa sổ sẽ lật.

Vì vậy, nếu view1 là subview bạn bắt đầu với và bạn muốn lật View2 sau đó thêm

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize]; 
[containerView addSubview:view1]; 

Và sau đó là cách đơn giản nhất để làm động có lẽ là:

[UIView transitionFromView:view1 
        toView:view2 
        duration:2.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:nil]; 
7

Đây là giải pháp làm việc của tôi stub, một điều đơn giản mất 2 giờ, damn: chúng tôi có 1 nút để lật mọi thứ, một bảng điều khiển được gọi là UIView chứa 2 chế độ xem mà tôi muốn trao đổi với hoạt ảnh lật.

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnFlip.frame = CGRectMake(10, 10, 50, 30); 
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal]; 
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnFlip]; 

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)]; 
    panel.backgroundColor = [UIColor darkGrayColor]; 
    [self.view addSubview:panel]; 

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelBack.tag = 1; 
    panelBack.backgroundColor = [UIColor brownColor]; 
    [panel addSubview:panelBack]; 

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelFront.tag = 2; 
    panelFront.backgroundColor = [UIColor whiteColor]; 
    [panel addSubview:panelFront]; 

    displayingFront = TRUE; 
} 

-(void)flip{ 

    [UIView transitionWithView:panel 
    duration:0.5 
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) 
    animations:^{ 
     if (displayingFront) { 
      //panelFront.hidden=TRUE; 
      //panelBack.hidden = FALSE; 
      [panelFront removeFromSuperview]; 
      [panel addSubview:panelBack]; 
     }else{ 
      //panelFront.hidden=FALSE; 
      //panelBack.hidden = TRUE; 
      [panelBack removeFromSuperview]; 
      [panel addSubview:panelFront]; 
     } 
    } 
    completion:^(BOOL finished){ 
     displayingFront = !displayingFront; 
    }]; 
} 
+0

cool ... hoạt động hoàn hảo – RATTLESNAKE

0

Hãy nhớ rằng quan điểm chứa đòi hỏi một nền tảng vững chắc color.It nghĩa bất cứ điều gì khác hơn color.This rõ ràng là sai lầm của tôi và dành thời gian khá dài để tìm nó ra.

0

sử dụng chuyển đổiTừ chế độ xem, cả giao diện trước và mặt sau phải ở trong chế độ xem khác (không phải chế độ xem siêu). bằng cách này nó sẽ không lật toàn bộ màn hình.

> superview 
>  another view 
>  backview 
>  frontview 

UIView.transitionFromView (frontView, toView: backView, thời gian: 0,5, lựa chọn: .TransitionFlipFromLeft | .ShowHideTransitionViews) {hoàn thành trong

}

Bạn có thể muốn làm cho (xem khác) bằng kích thước của mặt trước

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