iPhone UIView Animation Thực hành tốt nhất


142

Điều gì được coi là thực hành tốt nhất để tạo hiệu ứng chuyển cảnh xem trên iPhone?

Ví dụ, ViewTransitionsdự án mẫu từ apple sử dụng mã như:

CATransition *applicationLoadViewIn = [CATransition animation];
[applicationLoadViewIn setDuration:1];
[applicationLoadViewIn setType:kCATransitionReveal];
[applicationLoadViewIn setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[[myview layer] addAnimation:applicationLoadViewIn forKey:kCATransitionReveal];

nhưng cũng có những đoạn mã trôi nổi trên mạng trông như thế này:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.75];
[UIView setAnimationDelegate:self];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];
[myview removeFromSuperview];
[UIView commitAnimations];

Đâu là cách tiếp cận lí tưởng nhất? Nếu bạn có thể cung cấp một đoạn trích, nó sẽ được đánh giá cao.

GHI CHÚ: Tôi đã không thể có được cách tiếp cận thứ hai để hoạt động chính xác.

Câu trả lời:


118

Từ phần của tài liệu tham khảo UIView về beginAnimations:context:phương pháp:

Việc sử dụng phương pháp này không được khuyến khích trong iPhone OS 4.0 trở lên. Bạn nên sử dụng các phương pháp hoạt hình dựa trên khối thay thế.

Ví dụ: Hoạt hình dựa trên khối dựa trên Nhận xét của Tom

[UIView transitionWithView:mysuperview 
                  duration:0.75
                   options:UIViewAnimationTransitionFlipFromRight
                animations:^{ 
                    [myview removeFromSuperview]; 
                } 
                completion:nil];

4
Vì vậy, để rõ ràng, điều đó có nghĩa là sử dụng cách tiếp cận đầu tiên (CATransition), không phải cách thứ hai?
Steve N

2
Vâng, đó là cách tiếp cận đầu tiên (CATransition).
Tinh vân

16
@Steven N, không, nó có nghĩa là sử dụng các hình ảnh động dựa trên khối UIViewthay thế. Về cơ bản chúng giống như beginAnimationsvà bạn bè, nhưng sử dụng các tính năng chặn / đóng.
Dan Rosenstark

36
Vâng, Yar nói đúng. Đây là cách hoạt hình khối trông như thế nào: [UIView transitionWithView:mysuperview duration:0.75 options:UIViewAnimationTransitionFlipFromRight animations:^{ [myview removeFromSuperview]; } completion:nil]Kiểm tra tài liệu UIView để biết chi tiết.
Tom van Zummeren

3
Ngoại trừ nếu bạn muốn hỗ trợ điện thoại 3.1.3. Sau đó, không sử dụng các khối.
ZaBlanc

69

Tôi đã được sử dụng sau này cho rất nhiều hình ảnh động nhẹ đẹp. Bạn có thể sử dụng nó xen kẽ hai chế độ xem, hoặc làm mờ dần một góc nhìn trước mặt khác hoặc mờ dần đi. Bạn có thể bắn một cái nhìn khác hơn như một biểu ngữ, bạn có thể làm một đoạn xem hoặc thu nhỏ ... Tôi nhận được rất nhiều mileage ra khỏi beginAnimation/ commitAnimations.

Đừng nghĩ rằng tất cả những gì bạn có thể làm là:

[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:myview cache:YES];

Đây là một mẫu:

[UIView beginAnimations:nil context:NULL]; {
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    if (movingViewIn) {
// after the animation is over, call afterAnimationProceedWithGame
//  to start the game
        [UIView setAnimationDidStopSelector:@selector(afterAnimationProceedWithGame)];

//      [UIView setAnimationRepeatCount:5.0]; // don't forget you can repeat an animation
//      [UIView setAnimationDelay:0.50];
//      [UIView setAnimationRepeatAutoreverses:YES];

        gameView.alpha = 1.0;
        topGameView.alpha = 1.0;
        viewrect1.origin.y = selfrect.size.height - (viewrect1.size.height);
        viewrect2.origin.y = -20;

        topGameView.alpha = 1.0;
    }
    else {
    // call putBackStatusBar after animation to restore the state after this animation
        [UIView setAnimationDidStopSelector:@selector(putBackStatusBar)];
        gameView.alpha = 0.0;
        topGameView.alpha = 0.0;
    }
    [gameView setFrame:viewrect1];
    [topGameView setFrame:viewrect2];

} [UIView commitAnimations];

Như bạn có thể thấy, bạn có thể chơi với alpha, khung và thậm chí kích thước của chế độ xem. Chơi xung quanh. Bạn có thể ngạc nhiên với khả năng của nó.


52

Sự khác biệt dường như là số lượng kiểm soát bạn cần đối với hình ảnh động.

Các CATransition tiếp cận cho phép bạn kiểm soát nhiều hơn và do đó có nhiều thứ hơn để thiết lập, ví dụ. chức năng thời gian. Là một đối tượng, bạn có thể lưu trữ nó sau này, tái cấu trúc để trỏ tất cả các hình động của bạn vào nó để giảm mã trùng lặp, v.v.

Các UIViewphương thức lớp là các phương thức tiện lợi cho các hình ảnh động thông thường, nhưng bị hạn chế hơn CATransition. Ví dụ: chỉ có bốn loại chuyển tiếp có thể (lật trái, lật phải, cuộn tròn, cuộn tròn). Nếu bạn muốn làm mờ dần, bạn phải đào sâu để CATransition'slàm mờ quá trình chuyển đổi hoặc thiết lập một hình ảnh động rõ ràng vềUIView alpha .

Lưu ý rằng CATransitiontrên Mac OS X sẽ cho phép bạn chỉ định CoreImagebộ lọc tùy ý để sử dụng làm quá trình chuyển đổi, nhưng hiện tại bạn không thể thực hiện việc này trên iPhone, điều này thiếu CoreImage.


7
Lưu ý rằng đây là lời khuyên thời iOS 2.0. Xem câu trả lời của Rafael Vega về các phương pháp dựa trên khối nếu bạn đang dùng iOS 4.0 trở lên.
Ryan McCuaig

Cũng lưu ý rằng CoreImage hiện có sẵn kể từ iOS 5, nhưng chỉ có một vài tính năng của nó. Tôi tin rằng bạn có thể sử dụng chuyển đổi CoreImage trong hoạt hình, nhưng bạn không thể tạo các bộ lọc CoreImage tùy chỉnh trên iOS (5).
Aaron Ash

26

Chúng ta có thể làm động hình ảnh trong ios 5 bằng mã đơn giản này.

CGRect imageFrame = imageView.frame;
imageFrame.origin.y = self.view.bounds.size.height;

[UIView animateWithDuration:0.5
    delay:1.0
    options: UIViewAnimationCurveEaseOut
    animations:^{
        imageView.frame = imageFrame;
    } 
    completion:^(BOOL finished){
        NSLog(@"Done!");
    }];

5
điều này cũng có sẵn trong iOS 4 và được gọi là hoạt hình "dựa trên khối". Nó không bị giới hạn ở iOS 5 trở lên.
johnbakers

8

Trong các UIViewtài liệu, hãy đọc về chức năng này cho ios4 +

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

6

Dù sao, phương pháp "Chặn" được giới thiệu ngay bây giờ một ngày. Tôi sẽ giải thích các khối đơn giản dưới đây.

Hãy xem xét các snipped dưới đây. bug2 và bug 3 là imageViews. Hoạt hình dưới đây mô tả hoạt hình có thời lượng 1 giây sau khi trễ 1 giây. Bug3 được chuyển từ trung tâm của nó sang trung tâm của bug2. Khi hoạt ảnh hoàn thành, nó sẽ được ghi lại "Center Animation Done!".

-(void)centerAnimation:(id)sender
{
NSLog(@"Center animation triggered!");
CGPoint bug2Center = bug2.center;

[UIView animateWithDuration:1
                      delay:1.0
                    options: UIViewAnimationCurveEaseOut
                 animations:^{
                     bug3.center = bug2Center;
                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Center Animation Done!");
                 }];
}

Hy vọng là sạch !!!


2
bạn đã gán CG3 bug3.center cho bug3Center và ngay sau đó bạn đã gán CG2 bug2.center cho cùng một biến bug3Center? Tại sao bạn làm việc đó ?
pnizzle

Rất tiếc !! đó là một người bạn đánh máy. Cập nhật ngay.
Deepukjaya

2

Đây là Code for Smooth animation, có thể hữu ích cho nhiều nhà phát triển.
Tôi tìm thấy đoạn mã này từ hướng dẫn này.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setAutoreverses:YES];
[animation setFromValue:[NSNumber numberWithFloat:1.3f]];
[animation setToValue:[NSNumber numberWithFloat:1.f]];
[animation setDuration:2.f];
[animation setRemovedOnCompletion:NO];

[animation setFillMode:kCAFillModeForwards];
[[self.myView layer] addAnimation:animation forKey:@"scale"];/// add here any Controller that you want t put Smooth animation.

2

hãy thử và kiểm tra Swift 3 ...

UIView.transition(with: mysuperview, duration: 0.75, options:UIViewAnimationOptions.transitionFlipFromRight , animations: {
    myview.removeFromSuperview()
}, completion: nil)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.