2010-06-25 42 views
14

ứng dụng của tôi có một bộ điều khiển chuyển hướng và tôi không muốn có bất kỳ hình ảnh động trong đó:Ngăn hoạt ảnh khi nhấp vào nút "Quay lại" trong thanh điều hướng?

  • để ngăn chặn một hình ảnh động khi đẩy một cái nhìn, thật dễ dàng, thông qua pushViewController: hoạt hình: Phương pháp

  • nhưng khi tôi nhấp vào nút "quay lại" trên subview này, có một hình ảnh động! KO! Tôi có thể làm gì để ngăn chặn hoạt ảnh này?

+7

Tại sao bạn muốn để phá vỡ giao diện người dùng với hành vi phi tiêu chuẩn? –

+10

Nó không phải là tôi muốn phá vỡ giao diện người dùng với hành vi không chuẩn. Tôi chỉ không hiểu tại sao các tính năng SDK kiểm soát việc đẩy được hoạt ảnh hay không nhưng không có tính năng kiểm soát tương tự cho một cửa sổ bật lên. Tôi cảm thấy nó không nhất quán. –

+1

hành vi phi tiêu chuẩn khiến chúng tôi phát triển :) – Zac

Trả lời

3

Thanh lịch hơn với danh mục. Điều này giả định bạn điều khiển đối tượng điều hướng được thiết lập trong đại biểu ứng dụng của bạn. Chỉ cần đặt điều này trước khi @implementaion của bạn trong bộ điều khiển chế độ xem gốc.

#import "AppDelegate.h" 

@implementation UINavigationBar (custom) 
- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated; 
{ 

    AppDelegate *delegate = [[UIApplication sharedApplication] delegate]; 

    [delegate.navController popViewControllerAnimated:NO]; 

    return TRUE; 
} 


@end 
+1

Cảm ơn câu trả lời của bạn, tôi đã thử nó và nó thực sự hoạt động nhưng nó là đáng ngạc nhiên bởi vì bạn trở về TRUE cho một cái gì đó mong đợi một UINavigationItem. –

+1

Ngoài ra, giải pháp này hoạt động nếu bạn có 1 và chỉ 1 bộ điều khiển điều hướng trong ứng dụng của bạn. Nó sẽ không hoạt động với nhiều bộ điều khiển điều hướng. –

+0

nó chỉ nhận được thư bị trả lại trên đầu của tôi. Plz explaian. Tôi là bie mới. Thals –

2

Không phải bạn nên, tuy nhiên bạn có thể ghi đè hành vi chuẩn bằng cách tạo tùy chỉnh leftBarButtonItem trong chế độ xem của bạnController.

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStylePlain target:self action:@selector(backButtonPressed)]; 
[[self navigationItem] setLeftBarButtonItem:item]; 
[item release]; 

- (void)backButtonPressed 
{ 
    [[self navigationContoller] popViewControllerAnimated:NO]; 
} 

Các documentation nói rằng bạn chỉ nên vượt qua NOtrước xem bộ điều khiển nav được hiển thị.

Hãy nhớ rằng các ứng dụng không tuân thủ Nguyên tắc giao diện iPhone sẽ không được chấp nhận vào cửa hàng ứng dụng.

+0

Mã đó bị lỗi và thậm chí chỉ hoạt động một phần. Bạn sẽ không nhận được nút mũi tên "mũi tên". Lỗi trong mã của bạn - thiếu "]" trên dòng 1. Ngoài ra, mã của bạn trong dòng 2 không chính xác - Tôi tin rằng mã nên đọc: "[self.navigationItem setLeftBarButtonItem: item];" w.r.t. "điều này có thể chấp nhận được bởi Apple": 1. Điều đó không đúng - nhiều ứng dụng vi phạm HIG được chấp nhận; nhiều ứng dụng của Apple đã vi phạm nghiêm trọng nó. 2. Bất kỳ lúc nào bạn muốn thực hiện một cặp hoạt ảnh push/pop tùy chỉnh, bạn CẦN phải tắt một cặp mặc định (vì Apple không cung cấp API công khai để ghi đè nó). – Adam

+0

Cảm ơn câu trả lời của bạn. Tuy nhiên, tôi đồng ý với Adam: hình dạng "mũi tên" là một PHẢI có trong một ứng dụng iPhone. –

+0

Bạn luôn có thể tạo lại hình ảnh mũi tên. Tôi nghĩ rằng đó là một thực tế khá phổ biến, vì táo không cung cấp cho bạn một cách để làm cho một chương trình. – livingtech

3

Tôi đã đến SO tìm kiếm một giải pháp thanh lịch hơn, nhưng đây là cách tôi đã (thành công) làm điều đó cho đến nay.

Ý tưởng cơ bản:

  1. KHÔNG sử dụng UINavigationController; thay vì sử dụng nó là bộ phận cấu thành (ví dụ UINavigationBar) và làm công việc mình
  2. Kích hoạt thanh điều hướng để animate song song với hình ảnh động tùy chỉnh của riêng bạn (hay không, nếu bạn muốn có anim ở tất cả)

Những nhược điểm:

  1. UINavigationController xử lý một số việc khác, như tự động tải/dỡ bộ nhớ. Ngoài ra, nó "cứng mã hóa" vào tất cả UIViewControllers - họ luôn luôn có một tham chiếu đến UINavigationController có chứa chúng. Đó là một sự xấu hổ để ném tất cả điều này đi chỉ vì Apple không cung cấp một cái móc để thiết lập hình ảnh động tùy chỉnh.

Mã - trong bất cứ lớp tiếp quản cho các hình ảnh động:

UINavigationItem *backItem = [[UINavigationItem alloc] initWithTitle:@"Back"]; 
[navigationController.navigationBar pushNavigationItem:backItem animated:TRUE]; 
// next line only needed if you want a custom back anim too 
navigationController.navigationBar.delegate = self; 

... nếu bạn cũng muốn cắt hợp với tùy chỉnh lại hình ảnh động, bạn cần có dòng cuối cùng ở trên, do đó bạn sau đó có thể nghe thanh điều hướng và phản ứng song song, như sau:

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 
{ 
    // trigger your custom back animation here 

    return TRUE; 
} 
+0

Cảm ơn câu trả lời của bạn! Nhưng bạn nói đúng: tôi quá lười biếng để ném tất cả các tính năng của UINavigationController đi và tôi thích cho phép hoạt ảnh xuất hiện;) –

+3

*** Chấm dứt ứng dụng do ngoại lệ chưa được nắm bắt 'NSInternalInconsistencyException', lý do: 'Không thể tự thiết lập ủy quyền trên một UINavigationBar được quản lý bởi một bộ điều khiển. ' –

+0

Đọc lại bước 1 ở trên – Adam

3

Điều này ngăn cản hoạt hình mặc định.

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 

Trong trường hợp nếu bạn cần một hình ảnh động tùy chỉnh

- (void)viewWillDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: NO]; 

    CATransition *transition = [CATransition animation]; 
    transition.duration = 0.3; 
    transition.type = kCATransitionFade; 
    [self.navigationController.view.layer addAnimation:transition forKey:kCATransition]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [UIView setAnimationsEnabled: YES]; 
} 
Các vấn đề liên quan