19

Tôi có một chất pha loãng, tôi muốn trình bày cho người dùng chế độ xem nửa công khai.Nền trong suốt với UIViewController phương thức

Tôi phát hiện ra bằng cách thử nghiệm rằng nếu tôi chỉ đơn giản là đẩy chế độ xem trong suốt lên đầu ngăn xếp của NavigationController, nó sẽ không hiển thị mức độ trong suốt mà tôi muốn. Vì vậy, tôi quyết định chỉ cần thêm chế độ xem dưới dạng chế độ xem phụ của chế độ xem hiện tại ở đầu ngăn xếp.

Giải pháp này hoạt động, chế độ xem bên dưới vẫn hiển thị và Chế độ xem là 'nửa phương thức'. Vấn đề là, nếu khung nhìn cha kế thừa từ UITableViewController (như của tôi), thì khung nhìn tôi 'đẩy' vào nó, không bao gồm thanh điều hướng ở trên cùng. Tôi thực sự không muốn rơi vào tình huống mà tôi buộc phải bật/tắt các điều khiển trên thanh điều hướng mỗi lần tôi đẩy chế độ xem này, vì vậy tôi đã tự hỏi, nếu có ai biết về bất kỳ giải pháp nào tôi có thể sử dụng sao cho chế độ xem tôi đẩy lên UITableViewController thực sự sẽ 'đẩy lên' thanh điều hướng?

+0

http://stackoverflow.com/questions/12741224/ios-modal-viewcontroller-with-transparent-background/22829068#22829068 – Zaraki

Trả lời

13

Hài hước, tôi vừa làm điều tương tự hôm qua. Thật không may nó có vẻ là không thể. Khi bộ điều khiển chế độ xem được đặt, chế độ xem trước đó sẽ bị ẩn. Xem phần này previous question on the topic.

Bạn vẫn có thể sử dụng bộ điều khiển xem và các tập tin NIB bạn đã thiết lập - đây là mẫu mã của tôi

- (void)showUpgrade { 
    [self.upgradeVC viewWillAppear:NO]; 
    [self.view addSubview:self.upgradeVC.view]; 
    [self.upgradeVC viewDidAppear:NO]; 
} 

- (void)hideUpgrade { 
    [self.upgradeVC viewWillDisappear:NO]; 
    [self.upgradeVC.view removeFromSuperview]; 
    [self.upgradeVC viewDidDisappear:NO]; 
} 

- (UpgradeViewController *)upgradeVC { 
    if (_upgradeVC == nil) { 
     _upgradeVC = [[UpgradeViewController alloc] initWithNibName:[NSString stringWithFormat:@"UpgradeView_%@", self.deviceType] bundle:nil]; 
     _upgradeVC.delegate = self; 
    } 
    return _upgradeVC; 
} 

Bạn sẽ cần phải lưu trữ một tham chiếu đến bộ điều khiển xem cha mẹ trong bộ điều khiển xem phương thức để bạn có thể truy cập phương thức -hide. Tôi đã làm điều này thông qua một đại biểu.

Bạn cũng có thể dễ dàng thêm một số hoạt ảnh vào -show-hide nếu bạn muốn nó hoạt ảnh từ dưới cùng của màn hình - Tôi quá lười để làm điều này.

+0

Tôi không nghĩ rằng sdk táo cho phép một bg minh bạch trên một UIViewController trên iPhone. –

+0

Bạn xử lý các hướng khác nhau của thiết bị khi thực hiện việc này như thế nào? Dường như với tôi rằng nó sẽ luôn tải chế độ xem dọc là một vấn đề nếu chế độ xem hiện tại ở chế độ ngang. –

+0

đây không phải là một thực hành tốt. Hãy xem bài viết này. Nó nói về lý do tại sao thêm một quan điểm của VC cho người khác như là một subview là một ý tưởng tồi. http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/ – hackerinheels

-2

Bạn đã thử lặp lại các bản xem trước của Chế độ xem của Chế độ xem và đặt màu nền để xóa cho mọi chế độ xem? Đây là một hàm đệ quy DFS.

- (void)setBackgroundToClearForView:(UIView *)view { 
    if ([view subviews]) { 
     for (UIView *subView in [view subviews]) { 
      [self setBackgroundToClearForView:subView]; 
     } 
    } 

    if ([view respondsToSelector:@selector(setBackgroundColor:)]) { 
     [view performSelector:@selector(setBackgroundColor:) 
        withObject:[UIColor clearColor]]; 
    } 
} 

Để sử dụng nó gọi:

[self setBackgroundToClearForView:self.view]; 

trong viewDidLoad.

+0

Tôi không tự mình thử, nhưng sự hiểu biết của tôi là chế độ xem gốc thực sự bị xóa khỏi khung nhìn. Xem: http://stackoverflow.com/questions/587681/how-to-use-presentmodalviewcontroller-to-create-a-transparent-view – pix0r

-2

Điều này sẽ thực hiện thủ thuật .. Hãy thử cái này.

// for clear color or you can easily adjust the alpha here 
YourVC *vc=[[YourVC alloc]initWithNibName:@"YourVC" bundle:nil] ; 
vc.view.backgroundColor = [UIColor clearColor]; 
self.modalPresentationStyle = UIModalPresentationCurrentContext; 
[self presentViewController:vc animated:NO completion:nil]; 

Vì vậy, chế độ xem sẽ có chế độ toàn màn hình không giống như UIModalPresentationFormSheet ..

+3

Không làm việc cho tôi. – mxcl

+1

Điều này không có tác dụng, vì những lý do được mô tả - các chế độ xem nền được xóa sau khi trình bày phương thức. – tooluser

11

Hiện nay có một cách để đạt được điều này bằng iOS7 chuyển tùy chỉnh:

MyController * controller = [MyController new]; 
[controller setTransitioningDelegate:self.transitionController]; 
controller.modalPresentationStyle = UIModalPresentationCustom; 
[self controller animated:YES completion:nil]; 

Để tạo chuyển tiếp tùy chỉnh của bạn, bạn cần 2 điều:

  • Một đối tượng TransitionDelegate (thực hiện <UIViewControllerTransitionDelegate>)
  • Đối tượng "AnimatedTransitioning" (triển khai <UIViewControllerAnimatedTransitioning>)

Bạn có thể tìm thêm thông tin về quá trình chuyển đổi tùy chỉnh trong hướng dẫn này: http://www.doubleencore.com/2013/09/ios-7-custom-transitions/

0

Hãy thử điều này:

ViewController *vc = [[ViewController alloc] init]; 
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext]; 
[self presentViewController:vc animated:YES completion:nil]; 
+0

Tôi đã thử rằng, nó không hoạt động: ( – Supertecnoboff

13

iOS 8 thêm UIModalPresentationOverFullScreenpresentation style. Đặt giá trị này là modalPresentationStyle của bộ điều khiển chế độ xem được trình bày. Để có nhu cầu nâng cao hơn, hãy xem xét tạo một tùy chỉnh presentation controller.

+0

Cảm ơn bạn! Điều đó làm việc hoàn hảo cho tôi :) – Supertecnoboff

+0

Đây sẽ là câu trả lời đúng lúc iOS 8+ đã chấp nhận> 91% trên thiết bị iOS kể từ ngày 24 tháng 10, 2015. – Manuel