2012-03-01 45 views
21

Đây là dự án iPad, nơi tôi có UIView với một số subViews và tôi đang cố gắng tạo hoạt ảnh cho một trong UIViews này bằng cách sử dụng [UIView transitionFromView: toView: duration: options : hoàn thành], nhưng khi tôi chạy phương thức này, toàn bộ khung nhìn cha mẹ bị đảo lộn! Đây là mã Tôi đang sử dụng:Cách lật UIView cá nhân (không lật chế độ xem gốc)

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; 
[newView setBackgroundColor:[UIColor redColor]]; 
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

Bất kỳ ý tưởng về làm thế nào tôi có thể lật giữa các quan điểm này mà không có hiệu ứng động quan điểm toàn cha mẹ? Cảm ơn!

Trả lời

70

mã này có thể giúp bạn:

đặt hai quan điểm bạn muốn lật bên trong một cái nhìn vô danh với cùng kích thước và liên kết các IBOutlet UIView *newView,*oldView; quan điểm và đưa quan điểm mới trên đầu trang

bool a = NO; 

@implementation ViewController 

- (IBAction)flip:(id)sender 
{ 
    if (a == NO) { 
     [UIView transitionFromView:oldView toView:newView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = YES; // a = !a; 
    } 
    else { 
     [UIView transitionFromView:newView toView:oldView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = NO; // a = !a; 
    } 
} 
+5

Cảm ơn rất nhiều! Giải pháp là sử dụng chế độ xem vùng chứa. – DanMunoz

+0

@ Floris497, bạn đã lưu lại ngày của tôi. Cảm ơn rất nhiều :) – Ahmed

+1

Cảm ơn vì điều này. Tôi có cảm giác đây là giải pháp. Tôi đoán quá trình chuyển đổi là một mẹo nhỏ hơn, nó thực hiện hoạt ảnh lật trên chế độ xem gốc và một nửa bằng cách hoán đổi các bản phụ đề mà bạn chỉ định. Sau đó, một lần nữa, hầu hết các hình ảnh động vv .. trên iPhone là một thủ thuật :-) – Dermot

2

Sử dụng chế độ xem vùng chứa để giữ các bản xem phụ của bạn và làm cho vùng chứa có cùng kích thước với chế độ xem phụ bạn đang cố tạo hiệu ứng động.

Vì vậy, bạn có thể thiết lập chế độ xem của mình như thế này.

self.view-> "một cái nhìn container" -> subviews

2
**//flipping view continuously** 



bool a = NO; 


-(void)viewDidLoad 
{ 



// THIS is the canvass holding the two views this view is flipping 
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; 

    v.backgroundColor=[UIColor clearColor]; 

    [self.view addSubview:v]; 

    [v addSubview:yourfirstview]; 
    [v addSubview:yoursecondview]; 

// calling the method 

[NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(flip) 
            userInfo:nil 
            repeats:YES]; 

} 



//flipping view randomly 

-(void)flip 

{ 

if (a == NO) 
{ 

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
     a = YES; 
    } 

else if(a==YES) 
{ 

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
    a = NO; 
    } 

} 
37

tôi đã nhận được vấn đề này để làm việc cũng có. Tôi đã sử dụng mã được viết bởi Floris, nhưng mặc dù nó đã làm việc cho lần đầu tiên "lật" lật tiếp theo bắt đầu trở nên kỳ lạ khi các nút và nhãn trên giao diện người dùng giao diện người dùng bị mất ở đó.

Tôi đặt mã bên dưới vào vị trí và hoạt động tốt.

Vài điều cần lưu ý:

  1. panelView là một điều khiển UIView trên ViewController rằng có hai UIViews khác lồng vào bên trong nó (subviews). Cái đầu tiên được gọi là frontView, cái thứ hai được gọi là backView. (Xem hình dưới đây)

image of the view and subviews in IB

  1. tôi có một tài sản bool gọi displayingFront trên lớp

(trong .h của tôi)

@property BOOL displayingFront; 

trong my .m

@synthesize displayingFront; 

trong phương pháp viewDidLoad tôi

self.displayingFront = YES; 

Đây là mã trong .m mà tôi đã dựng lên để hai nút nếu mặt trước và sau UIViews ...

- (IBAction)flip:(id)sender 
{ 
    [UIView transitionWithView:self.panelView 
         duration:1.0 
         options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : 
           UIViewAnimationOptionTransitionFlipFromLeft) 
        animations: ^{ 
         if(displayingFront) 
         { 
          self.frontView.hidden = true; 
          self.backView.hidden = false; 
         } 
         else 
         { 
          self.frontView.hidden = false; 
          self.backView.hidden = true; 
         } 
        } 

        completion:^(BOOL finished) { 
         if (finished) { 
          displayingFront = !displayingFront; 
         } 
        }]; 
} 
+0

Tôi nghĩ rằng điều này là sạch hơn so với câu trả lời – RonPelayo

+0

Sự khác biệt với cách tiếp cận này là các hình động xảy ra sau khi lật ... do đó frontView bị ẩn và backView hiển thị sau khi lật. Cách tiếp cận "transitionFromView" được nêu chi tiết ở trên sẽ thêm khung nhìn tại điểm giữa sao cho khi thời gian lật hoàn thành, "toView" đã được hiển thị. – wuf810

+0

Cảm ơn! Điều này giải quyết được vấn đề của tôi với các bản xem trước bị thất lạc của các chế độ xem chuyển đổi (nhãn). Chúng nằm rải rác trên màn hình. –

2

Tôi cố định vấn đề này bằng cách sử dụng hình ảnh động cũ-học:

[UIView beginAnimations:@"Flip" context:nil]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; 

[self addSubview:secondView]; 

[UIView commitAnimations]; 

Ngoài ra bạn có thể loại bỏ các firstView:

[firstView removeFromSuperview]; 
Các vấn đề liên quan