2009-09-30 25 views
7

Tôi muốn tạo một lớp con UIViewController có thể tái sử dụng có thể được hiển thị dưới dạng bộ điều khiển chế độ xem trên bất kỳ trình điều khiển chế độ xem nào khác. Một trong những điều đầu tiên mà VC có thể tái sử dụng này cần làm là bật lên một UIActionSheet. Để làm điều này, tôi tạo một khung nhìn mặc định (trống) trong VC của tôi để hiển thị trang tính hành động.Làm thế nào tôi có thể tạo một UIViewController phương thức mờ?

Tuy nhiên, điều này có vẻ xấu vì, khi vc phương thức bật lên, vc gốc bị ẩn. Vì vậy, có vẻ như tờ hành động đang trôi nổi trên nền trống. Sẽ tốt hơn nếu trang tính hành động có thể xuất hiện để bật lên trên vc gốc (mẹ).

Có cách nào để đạt được điều này không? Có an toàn để chỉ đơn giản là lấy quan điểm của cha mẹ vc và animate UIActionSheet từ đó?

+0

gặp vấn đề tương tự. Bất kỳ giải pháp nào ?? – Frade

Trả lời

0

Bạn chỉ có thể hiển thị nó trên bộ điều khiển chế độ xem cha mẹ bằng cách chèn chế độ xem trong chế độ xem gốc.

Something như thế này:

PseudoModalVC *vc = ...//initialization 
vc.view.backgroundColor = [UIColor clearColor]; // like in previous comment, although you can do this in Interface Builder 
vc.view.center = CGPointMake(160, -vc.view.bounds.size.height/2); 
[parentVC.view addSubView:vc.view]; 

// animation for pop up from screen bottom 
[UIView beginAnimation:nil context:nil]; 
vc.view.center = CGPointMake(160, vc.view.bounds.size.height/2); 
[UIView commitAnimation]; 
+1

Nếu bạn làm điều này, bạn cũng cần phải thực hiện tất cả các cuộc gọi thích hợp đến các phương thức như "viewWillAppear" trong trình điều khiển chế độ xem được hiển thị. UINavigationController và hệ thống phương thức xử lý điều này cho bạn bình thường. – DougW

-1

Yep. Thêm nó vào chế độ xem của trình điều khiển xem hiện tại (hoặc dưới dạng một khung nhìn con của cửa sổ) và làm động nó trên màn hình như Valerii nói.

Để loại bỏ nó với một hình ảnh động, làm được điều này (tôi giả định quan điểm phương thức là 320 x 460 và nó sẽ trượt xuống khỏi màn hình):

- (void)dismissModal 
{ 
    // animate off-screen 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveEaseOut]; 
    [UIView setAnimationDuration:0.50]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; 

    self.view.frame = CGRectMake(0, 480, 320, 460); 

    [UIView commitAnimations]; 
} 

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context 
{ 
    // don't remove until animation is complete. otherwise, the view will simply disappear 
    [self.view removeFromSuperview]; 
} 
14

Sau khi xem phương thức của bạn sinh động trong, nó được thay đổi kích thước để có kích thước bằng với chế độ xem gốc của nó. Những gì bạn có thể làm là bên viewDidAppear bạn :, chụp ảnh quan điểm của parentController, sau đó chèn một UIImageView chứa hình ảnh của cha mẹ ở mặt sau của danh sách xem riêng bạn của subviews:

#pragma mark - 
#pragma mark Sneaky Background Image 
- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    // grab an image of our parent view 
    UIView *parentView = self.parentViewController.view; 

    // For iOS 5 you need to use presentingViewController: 
    // UIView *parentView = self.presentingViewController.view; 

    UIGraphicsBeginImageContext(parentView.bounds.size); 
    [parentView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *parentViewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // insert an image view with a picture of the parent view at the back of our view's subview stack... 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds]; 
    imageView.image = parentViewImage; 
    [self.view insertSubview:imageView atIndex:0]; 
    [imageView release]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 

    // remove our image view containing a picture of the parent view at the back of our view's subview stack... 
    [[self.view.subviews objectAtIndex:0] removeFromSuperview]; 
} 
+1

Đối với iOS 5, bạn cần sử dụng 'presentingViewController' thay vì' parentViewController'. Tôi đã cập nhật câu trả lời của bạn để bao gồm điều đó. –

+0

Điều này chủ yếu là hoạt động tuyệt vời, nhưng khi tôi thử nó tôi nhận được một khoảng cách 20 px ở phía trên của hình ảnh xem cha mẹ gây ra (tôi đoán) bởi thanh trạng thái. Bất kỳ đề xuất để sửa chữa đó? – Mac

+0

Cập nhật: Tôi đã quản lý bản sửa lỗi bằng cách dịch ngữ cảnh hình ảnh của tôi 20 pixel trở lên, nhưng tôi vẫn tò mò là tại sao tôi phải làm như vậy khi có vẻ như không có ai khác có? – Mac

Các vấn đề liên quan