8

tôi sử dụng đoạn mã sau như một phần mở rộng để UINavigationController để đẩy một bộ điều khiển vùng đang xem với một hình ảnh động tùy chỉnh:Đẩy một UITableViewController với hình ảnh động tùy chỉnh luôn sinh động UINavigationItem Tiêu đề

@implementation UINavigationController (PushAnimation) 

- (void)pushViewController:(UIViewController*)controller withTransition:(UIViewAnimationTransition)transition 
{ 
    [UIView beginAnimations:nil context:NULL]; 
    [self pushViewController:controller animated:NO]; 
    [UIView setAnimationDuration:1.0]; 
    [UIView setAnimationBeginsFromCurrentState:YES];   
    [UIView setAnimationTransition:transition forView:self.view cache:YES]; 
    [UIView commitAnimations]; 
} 

@end 

Với bộ nhớ đệm được kích hoạt, tôi nhận được một hành vi hoạt hình lạ khi đẩy UITableViewController. Tiêu đề của chế độ xem được đẩy xuất hiện sau khi hoạt ảnh tùy chỉnh hoàn tất. Với phong cách chuyển đổi UIViewAnimationTransitionNone, nó trở nên rõ ràng rằng tiêu đề chính nó là hoạt hình. Nó được di chuyển từ góc trên cùng bên trái của màn hình vào giữa của UINavigationBar.

Khi bộ đệm ẩn bị tắt, hoạt ảnh này không hiển thị do tốc độ của nó, nhưng tốc độ khung hình giảm đáng kể.

Làm cách nào để ngăn tiêu đề hoạt ảnh?

+1

Tôi nghĩ rằng hoạt ảnh của tiêu đề đang diễn ra trong mã 'UINavigationBar'. Một ý tưởng cũng sẽ là phân lớp và thay đổi hành vi mặc định – adig

Trả lời

0

Chỉ cần cập nhật nhanh bản sửa lỗi của tôi là gì. Không thể ghi đè hành vi mặc định của UINavigationBar, vì iOS sử dụng API riêng tư để triển khai hoạt ảnh. Vì vậy, tôi đã kết thúc loại bỏ tất cả các hình ảnh động trên UINavigationBar và subviews khác nhau của nó, sử dụng đoạn mã sau:

[self.navigationBar.layer removeAllAnimations]; 
for (UIView *view in self.navigationBar.subviews) { 
    [view.layer removeAllAnimations]; 
    for (UIView *sub in view.subviews) { 
     [sub.layer removeAllAnimations]; 
    } 
} 

Điều quan trọng là điều này được gọi sau khi [self pushViewController:controller animated:NO];.

0

Vấn đề là bạn đang hoạt ảnh toàn bộ chế độ xem self.view. self.view chứa bộ điều khiển xem cũng như UINavigationBar. Vì vậy, bạn có thể sẽ phải nhận tất cả các bản xem trước của self.view và sau đó tạo ảnh động chỉ view liên quan đến bộ điều khiển chế độ xem của bạn.

+0

Vâng, tôi cũng muốn tạo hiệu ứng cho thanh điều hướng vì tôi muốn toàn bộ màn hình thay đổi, không chỉ nội dung bên dưới UINavigationBar. Vấn đề là, mà tôi dường như không thể vô hiệu hóa điều hướng mặc định của UINavigationbar. –

0

Sử dụng mã này để tùy chỉnh hình ảnh động chuyển hướng bạn theo một cách rất đơn giản:

CATransition* transition = [CATransition animation]; 
transition.duration = 0.5; 
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; 
transition.type = kCATransitionMoveIn; //kCATransitionPush; //kCATransitionReveal; //kCATransitionFade; 
//transition.subtype = kCATransitionFromRight; //transition.subtype = kCATransitionFromLeft; //transition.subtype = kCATransitionFromTop; //transition.subtype = kCATransitionFromBottom; 
transition.subtype = kCATransitionFromRight; 
[self.navigationController.view.layer addAnimation:transition forKey:nil]; 
[[self navigationController] popViewControllerAnimated:NO]; 

và điều tương tự cho push.

** Hãy chắc chắn để #import <QuartzCore/QuartzCore.h> trong lớp học của bạn, và cũng có thể thêm khung làm việc để dự án của bạn

target> Xây dựng giai đoạn> Link Binary Với Libraries> vào nút "+"> QuartzCore.framework

. **