2012-10-28 16 views
10

Tôi muốn hiển thị bảng cảnh báo tùy chỉnh trên ứng dụng của mình, nhưng có UIViewController trước đó hiển thị trong nền. Tôi đã hy vọng để hiển thị điều này như một bộ điều khiển xem phương thức. Làm thế nào để làm điều này mà không có UIViewController trước chuyển sang màu đen và biến mất?Làm cách nào để che phủ một modalViewController ở đầu chế độ xem khác mà không có biến thể gốc biến mất?

Trả lời

17

Thay vì hiển thị các vc mới như một vc phương thức, bạn cần phải thêm nó như nhìn con điều khiển:

AlertPanelVC *alertVC = ... 
[self addChildViewController: alertVC]; 
alertVC.view.frame = ...; //or something equivalent if you're using auto layout 
[self.view addSubview: alertVC.view]; 
[alertVC didMoveToParentViewController: self]; 

Để bỏ qua nó:

[alertVC willMoveToParentViewController:nil]; 
[alertVC.view removeFromSuperview]; 
[alertVC removeFromParentViewController]; 
+1

Câu trả lời hay. Tôi sẽ thêm hai sửa đổi. (1) Thay vì thêm và loại bỏ chế độ xem phụ đơn giản, bạn có thể tạo hiệu ứng động. (2) Bạn sẽ muốn chặn tương tác người dùng với phần bên ngoài của màn hình hiển thị trong nền. Để làm như vậy, hãy làm cho chế độ xem của trình điều khiển chế độ xem mới có cùng kích thước với màn hình, với nền rõ ràng trong đó tương tác của người dùng bị tắt. Người dùng không thể nhìn thấy nó (nó rõ ràng) nhưng nó chặn chạm từ rơi xuống. Giao diện mới của bạn sau đó là một chế độ xem con trên đầu trang * đó *. – matt

+0

Đồng ý. Cá nhân tôi thích sử dụng một 'background view' màu đen với giá trị alpha là 0.5-0.8. Điều đó tạo ra hiệu ứng mà nền tối khi 'lớp phủ' được hiển thị. Nhưng đó chỉ là sở thích cá nhân. :) – Tobi

+0

Chỉ cần thử thêm 'nil' như fromViewController ... gặp lỗi" 'Bộ điều khiển xem trẻ em (null) và phải có bộ điều khiển xem chung chung khi gọi - [UIViewController transitionFromViewController: ...' ", vì vậy tôi không nghĩ rằng điều này sẽ làm việc. – denikov

1

Dưới đây là những gì tôi đã sử dụng:

MyCustomAlertViewController *myCustomAlertViewController = [[MyCustomAlertViewController alloc]initWithNibName:@"MyCustomAlertViewController" bundle:nil]; 
myCustomAlertViewController.delegate = self; //optional if you have delegate setup 
[myCustomAlertViewController setModalPresentationStyle:UIModalPresentationPageSheet]; 
[myCustomAlertViewController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal]; 
[self presentViewController:myCustomAlertViewController animated:YES completion:^{ 
    //do stuff after the view is displayed. 

}]; 
myCustomAlertViewController.view.superview.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin; 
myCustomAlertViewController.view.superview.frame = CGRectMake(calculatedCenterX, CalculatedCenterY, myCustomAlertViewControllerWidth, myCustomAlertViewControllerHeight); 
//calculatedCenterX = (1024 - myCustomAlertViewControllerWidth)/2; //for example 
//calculatedCenterY = (768 - myCustomAlertViewControllerHeight)/2; 
+0

Điều đó chỉ hoạt động trên iPad. – Tobi

+0

Đúng, @Tobi - và người hỏi ban đầu đã sử dụng thẻ iPhone chứ không phải iPad. – matt

0

có thành phần cool blurred cho điều đó. tất nhiên, chỉ là vấn đề về hương vị. :)

0

Khi trình bày bộ điều khiển chế độ xem bằng cách sử dụng kiểu UIModalPresentationFullScreen, UIKit thường loại bỏ chế độ xem của trình điều khiển chế độ xem cơ bản sau khi kết thúc hoạt ảnh chuyển tiếp. Bạn có thể ngăn chặn việc loại bỏ các khung nhìn đó bằng cách chỉ định kiểu UIModalPresentationOverFullScreen thay thế. Bạn có thể sử dụng kiểu đó khi bộ điều khiển xem được trình bày có các vùng trong suốt cho phép hiển thị nội dung cơ bản.

From here

Vì vậy, về cơ bản nhanh chóng viewController của bạn, xác định kiểu presenation modal và sau đó trình bày các điều khiển xem.

Nếu bạn muốn có nền trong suốt (bán), chỉ cần điều chỉnh màu của giao diện chính của bộ điều khiển chế độ xem.