Làm thế nào để tạo hoạt ảnh trả lại UIView?


92

Tôi có CATransition sau đây cho một UIView được gọi finalScoreView, làm cho nó vào màn hình từ trên cùng:

CATransition *animation = [CATransition animation];
animation.duration = 0.2;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];

[gameOver.layer addAnimation:animation forKey:@"changeTextTransition"];
[finalScoreView.layer addAnimation:animation forKey:@"changeTextTransition"];

Làm cách nào để làm cho nó bật lên một lần sau khi nó đi xuống, sau đó đứng yên? Nó vẫn sẽ vào màn hình từ trên cùng nhưng sau đó bị bật lên khi hạ xuống.

Bất kỳ sự giúp đỡ sẽ được đánh giá cao, cảm ơn!


3
Bạn đang nhắm mục tiêu iOS7 trở lên? Nếu vậy, bạn có thể tận dụng UIKit Dynamics
WDUK

Câu trả lời:


144

Với iOS7 và UIKit Dynamics, bạn sẽ không còn cần phải sử dụng CAKeyframeAnimationshoặc UIViewhoạt ảnh nữa!

Hãy xem ứng dụng Danh mục UIKit Dynamics của Apple . Ngoài ra, Teehanlax có một hướng dẫn rõ ràng, ngắn gọn với đầy đủ dự án trong github . Nếu bạn muốn có một bài hướng dẫn chi tiết hơn về sự xuất hiện của động lực học, thì hướng dẫn Ray Winderlich là rất tốt. Như mọi khi, tài liệu của Apple là điểm dừng đầu tiên tuyệt vời, vì vậy hãy xem tham chiếu Lớp UIDynamicAnimator trong tài liệu.

Đây là một chút mã từ hướng dẫn Teenhanlax:

self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];

UIGravityBehavior* gravityBehavior = 
                [[UIGravityBehavior alloc] initWithItems:@[self.redSquare]];
[self.animator addBehavior:gravityBehavior];

UICollisionBehavior* collisionBehavior = 
                [[UICollisionBehavior alloc] initWithItems:@[self.redSquare]]; 
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collisionBehavior];

UIDynamicItemBehavior *elasticityBehavior = 
                [[UIDynamicItemBehavior alloc] initWithItems:@[self.redSquare]];
elasticityBehavior.elasticity = 0.7f;
[self.animator addBehavior:elasticityBehavior];

Và đây là kết quả

Nảy vuông

UIKit Dynamics là một bổ sung thực sự mạnh mẽ và dễ sử dụng cho iOS7 và bạn có thể nhận được một số giao diện người dùng tuyệt vời từ nó.

Những ví dụ khác:

Nút trả lại Trượt trả lại Bộ sưu tập mùa xuân Bộ sưu tập nước rút WWDC

Các bước triển khai động lực học UIKit luôn giống nhau:

  1. Tạo UIDynamicAnimatorvà lưu trữ nó trong một thuộc tính mạnh
  2. Tạo một hoặc nhiều UIDynamicBehaviors. Mỗi hành vi nên có một hoặc nhiều mục, thường là một chế độ xem để tạo hoạt ảnh.
  3. Đảm bảo rằng trạng thái ban đầu của các mục được sử dụng trong UIDynamicBehaviorslà trạng thái hợp lệ trong UIDynamicAnimatormô phỏng.

1
Xin chào Michael, cảm ơn rất nhiều vì sự giúp đỡ của bạn! Điều này chắc chắn trông cực kỳ dễ làm! Tôi đã thử nó và nó hoạt động khi nó chạm dưới cùng của chế độ xem, nhưng nó không hoạt động với chế độ xem khác - stackoverflow.com/questions/21895674/… - Tôi rất muốn nếu bạn có thể giúp tôi! :) Cảm ơn
user3127576

2
Một hướng dẫn THUẬT NGỮ NHƯNG bạn chỉ cần sử dụng một dòng mã, sử dụngSpringWithDamping, để thoát!
Fattie

2
Bạn có thể chia sẻ một số mẫu mã cho hoạt ảnh trả lại Uitableview như trên. Tôi đang thử với UITableview nhưng không biết bắt đầu từ đâu.
Dinesh

1
UIKit Dynamics rất tuyệt khi bạn xử lý các trường hợp ví dụ. Nhưng khi nói đến nhiệm vụ thực, bạn sẽ thấy nó thô và hạn chế như thế nào. Một vấn đề lớn là ghi đè UIDynamicItemBehavior(thực ra là thuộc tính, không phải hành vi). Bạn không thể chỉ sử dụng các thuộc tính vật lý khác nhau trong các hành vi khác nhau. Một trường hợp khác đang triển khai các giới hạn cao su giống như UIScrollView - nó rất phức tạp. Tôi có thể viết nhiều hơn nữa nhưng nhận xét quá ngắn.
kelin

2
vui lòng thêm mã đầy đủ. Mã của bạn mô tả cách tạo UIDynamicAnimatorvà các đối tượng liên kết với nó nhưng không trả lời làm thế nào để sử dụng chúng
Vyachaslav Gerchicov

261

Một giải pháp thay thế đơn giản hơn UIDynamicAnimatortrong iOS 7 là Spring Animation (hoạt ảnh khối UIView mới và mạnh mẽ), có thể cung cấp cho bạn hiệu ứng nảy đẹp mắt với giảm chấn và vận tốc: Objective C

[UIView animateWithDuration:duration
  delay:delay
  usingSpringWithDamping:damping
  initialSpringVelocity:velocity
  options:options animations:^{
    //Animations
    }
  completion:^(BOOL finished) {
    //Completion Block
}];

Nhanh

UIView.animateWithDuration(duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

Swift 4.0

UIView.animate(withDuration:duration,
     delay: delay,
     usingSpringWithDamping: damping,
     initialSpringVelocity: velocity,
     options: options,
     animations: {
            //Do all animations here
            }, completion: {
            //Code to run after animating
                (value: Bool) in
        })

usingSpringWithDamping 0,0 == rất nảy. 1.0 giúp nó giảm tốc mượt mà mà không bị quá tải.

initialSpringVelocityđại khái là "khoảng cách mong muốn, chia cho giây mong muốn". 1,0 tương ứng với tổng khoảng cách hoạt ảnh được truyền đi trong một giây. Ví dụ, tổng khoảng cách hoạt ảnh là 200 điểm và bạn muốn điểm bắt đầu của hoạt ảnh khớp với tốc độ xem là 100 pt / s, hãy sử dụng giá trị 0,5.

Hướng dẫn chi tiết hơn và ứng dụng mẫu có thể được tìm thấy trong hướng dẫn này . Tôi hy vọng điều này là hữu ích cho ai đó.


2
Đây là một dự án demo tôi đã tạo để giúp bạn có được hình ảnh động vừa ý. Thưởng thức! github.com/jstnheo/SpringDampingDemo
jstn

Cổ vũ cho dự án demo đó, anh bạn. Thực sự giúp tìm ra những giá trị này vì chúng khá khó hiểu. Tôi muốn Apple đã làm cho họ rõ ràng hơn
kakubei

32

Đây là một dự án demo tôi đã tạo để giúp bạn có được hình ảnh động vừa ý. Thưởng thức!

SpringDampingDemo

nhập mô tả hình ảnh ở đây


Cổ vũ cho dự án demo đó, anh bạn. Thực sự giúp tìm ra những giá trị này vì chúng khá khó hiểu. Tôi muốn Apple đã làm cho họ rõ ràng hơn
kakubei

-1
- (IBAction)searchViewAction:(UIButton*)sender
{
  if(sender.tag == 0)
  {
    sender.tag = 1;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = -320;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;
    self.searhTopView.frame = optionsFrame;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 0;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];        
}
else
{
    sender.tag = 0;

    CGRect optionsFrame2 = self.defaultTopView.frame;
    optionsFrame2.origin.x = 0;

    CGRect optionsFrame = self.searhTopView.frame;
    optionsFrame.origin.x = 320;

    [UIView animateWithDuration:1.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:1.0 options:0 animations:^{

        CGRect optionsFrame = self.searhTopView.frame;

        optionsFrame.origin.x = 320;
        self.searhTopView.frame = optionsFrame;
        self.defaultTopView.frame = optionsFrame2;
    } completion:^(BOOL finished) {
    }];
}
}

1
Không có giải thích trong mã và không có bình luận. Đây không phải là hữu ích
Lorenzo
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.