Cách sử dụng presentModalViewController để tạo chế độ xem trong suốt


80

Tôi đang hiển thị chế độ xem phương thức với

[self presentModalViewController:controller animated:YES];

Khi chế độ xem di chuyển lên màn hình, nó trong suốt theo cài đặt trong tệp xib mà nó được tạo từ đó, nhưng khi nó lấp đầy màn hình, nó sẽ mờ đục.

Có cách nào giữ chế độ xem trong suốt không?

Tôi nghi ngờ rằng chế độ xem nó đang được đặt qua không được hiển thị thay vì sau đó chế độ xem phương thức trở nên mờ đục.


1
Câu hỏi này bây giờ khá cũ. Khi tìm kiếm câu trả lời, hãy tìm câu trả lời áp dụng cho phiên bản iOS mà bạn sử dụng.
Darryl Braaten

Đây stackoverflow.com/q/27598846/1603234 làm cho tôi mỉm cười, bây giờ đến lượt của bạn :)
Hemang

bạn có thể sử dụngviewcontroller.modalPresentationStyle = .FormSheet
Gerald

Câu trả lời:


63

Chế độ xem của bạn vẫn trong suốt, nhưng khi bộ điều khiển phương thức của bạn ở trên cùng của ngăn xếp, chế độ xem phía sau nó sẽ bị ẩn (như trường hợp với bất kỳ bộ điều khiển chế độ xem nào trên cùng). Giải pháp là tự tạo hoạt ảnh cho một chế độ xem theo cách thủ công; thì phía sau viewController sẽ không bị ẩn (vì bạn sẽ không 'rời' nó).


Cảm ơn, điều đó xác nhận những gì tôi nghi ngờ.
Darryl Braaten

1
Tôi đã gửi báo cáo lỗi với Apple về vấn đề này. Mở Radar: openradar.appspot.com/radar?id=1062402
lý thuyết,

4
Vấn đề với điều này là chế độ xem được trình bày không thể có cài đặt tự động chuyển hướng của riêng nó.
Shizam

85

Sau iOS 3.2, có một phương pháp để thực hiện việc này mà không cần bất kỳ “thủ thuật” nào - hãy xem tài liệu về thuộc tính modalPresentationStyle . Bạn có rootViewController sẽ hiển thị viewController. Vì vậy, đây là mã để thành công:

viewController.view.backgroundColor = [UIColor clearColor];
rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[rootViewController presentModalViewController:viewController animated:YES];

Với phương pháp này, nền của viewController sẽ trong suốt và rootViewController bên dưới sẽ hiển thị. Xin lưu ý rằng điều này dường như chỉ hoạt động trên iPad, hãy xem nhận xét bên dưới.


1
Xin chào .. +1 từ phía tôi bcoz nó hoạt động tốt trong iOS 4 và iPad. nhưng nó sẽ hoạt động như thế nào trong iPhone 3.0. Cảm ơn
Mitesh Khatri

3
Nó không hoạt động với tôi (iOS 5.0), ai đó có thể hiển thị một số mã không?
Daniel

6
Điều này dường như không hoạt động trên iPhone / iPod, chỉ iPad (xem tài liệu được liên kết trong câu trả lời). @simpleBob: có lẽ đây là lý do tại sao nó không hoạt động với bạn?
Mac

1
FYI: Tôi đã hỏi câu hỏi tương tự trong bài đăng này: stackoverflow.com/questions/14419395/…
The Crazy Chimp,

1
Tôi đã thử nghiệm trên iOS 8 và tôi phải sử dụng Over Current Contextlàm kiểu trình bày.
haxpor

48

Những gì tôi cần để làm cho điều này hoạt động:

self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;

1
nó hoạt động đơn giản, nhờ tôi chỉ cần giữ mã của tôi trên - (BOOL) ứng dụng: (UIApplication *) didFinishLaunchingWithOptions ứng dụng: (NSDictionary *) phương pháp launchOptions và thì đấy
Kshitiz Ghimire

2
Bạn cũng có thể chỉ cần đặt modalPresentationStyletrên bộ điều khiển chế độ xem trình bày (thay vì trên cửa sổ rootViewController).
mbinna

Cảm ơn!! thậm chí hoạt động khi bạn thực hiện, [self performanceSegueWithIdentifier: @ "open" sender: self];
DogCoffee

Bạn luôn có thể tạo hiệu ứng cho chế độ xem bằng tay trong viewdidload của phương thức.
Jacob K

2
Lưu ý rằng, như anh T nói bên dưới, modalPresentationStyle phải được thiết lập trên view controller hiện có toàn màn hình.
jessepinho

24

Đối với những người muốn xem một số mã, đây là những gì tôi đã thêm vào bộ điều khiển chế độ xem trong suốt của mình:

// Add this view to superview, and slide it in from the bottom
- (void)presentWithSuperview:(UIView *)superview {
    // Set initial location at bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, superview.bounds.size.height);
    self.view.frame = frame;
    [superview addSubview:self.view];            

    // Animate to new location
    [UIView beginAnimations:@"presentWithSuperview" context:nil];
    frame.origin = CGPointZero;
    self.view.frame = frame;
    [UIView commitAnimations];
}

// Method called when removeFromSuperviewWithAnimation's animation completes
- (void)animationDidStop:(NSString *)animationID
                finished:(NSNumber *)finished
                 context:(void *)context {
    if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
        [self.view removeFromSuperview];
    }
}

// Slide this view to bottom of superview, then remove from superview
- (void)removeFromSuperviewWithAnimation {
    [UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];

    // Set delegate and selector to remove from superview when animation completes
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];

    // Move this view to bottom of superview
    CGRect frame = self.view.frame;
    frame.origin = CGPointMake(0.0, self.view.superview.bounds.size.height);
    self.view.frame = frame;

    [UIView commitAnimations];    
}

Vấn đề duy nhất tôi gặp phải với giải pháp này là quản lý bộ nhớ. Ví dụ: TestViewController * testView = [[TestViewController phân bổ] initWithNibName: @ "TestView" gói: nil]; [testView presentWithSuperview: self.navigationController.view]; Sẽ hoạt động tốt, tuy nhiên nếu bạn cố gắng để phát hành hoặc autorelease View, bất kỳ cuộc gọi đến các phương pháp trong quan điểm cho rằng, sẽ dẫn đến trường hợp ngoại lệ truy cập xấu
Mick Walker

Bạn có chắc không? Tôi nghĩ chế độ xem sẽ được [superview addSubview:] giữ lại, vì vậy bạn có thể phát hành nó.
Kristopher Johnson

Nếu bạn gọi presentWithSuperview sau đó phát hành testView thì nó bị treo. Nó cũng hiển thị hiển thị "dưới" bất kỳ thanh công cụ NavigationController nào, v.v.
Ryan Booker

Điều này đã hoạt động tốt đối với tôi trong một thời gian dài, nhưng nó không còn hoạt động ở chế độ ngang. Bất cứ ai có cùng một vấn đề này?
Jeffry van de Vuurst

19

Cách được Apple chấp thuận để thực hiện điều này trong iOS 8 là đặt modalPresentationStyle thành 'UIModalPresentationOverCurrentContext'.

Từ tài liệu UIViewController:

UIModalPresentationOverCurrentContext

Một kiểu trình bày trong đó nội dung chỉ được hiển thị trên nội dung của bộ điều khiển chế độ xem chính. Các dạng xem bên dưới nội dung được trình bày không bị xóa khỏi phân cấp dạng xem khi bản trình bày kết thúc. Vì vậy, nếu bộ điều khiển chế độ xem được trình bày không lấp đầy màn hình bằng nội dung mờ đục, thì nội dung cơ bản sẽ hiển thị xuyên suốt.

Khi trình bày bộ điều khiển dạng xem trong cửa sổ bật lên, kiểu trình bày này chỉ được hỗ trợ nếu kiểu chuyển tiếp là UIModalTransitionStyleCoverVertical. Việc cố gắng sử dụng một kiểu chuyển tiếp khác sẽ kích hoạt một ngoại lệ. Tuy nhiên, bạn có thể sử dụng các kiểu chuyển tiếp khác (ngoại trừ chuyển tiếp cuộn tròn một phần) nếu bộ điều khiển chế độ xem chính không ở trong cửa sổ bật lên.

Có sẵn trong iOS 8.0 trở lên.

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/

Video 'View Controller Advancements in iOS 8' từ WWDC 2014 đi sâu vào vấn đề này một số chi tiết.

Đảm bảo cung cấp cho bộ điều khiển chế độ xem được trình bày của bạn có màu nền rõ ràng (nếu không, nó vẫn có vẻ mờ đục).


nó mang lại cho tôi một màn hình màu đen trên iOS8 và iOS9
Amit Hooda

Trên thực tế nó hoạt động nếu bạn thiết lập tầm nhìn của bạn điều khiển của xem một màu nền với một giá trị alpha dưới 1
Pierre

16

Có một tùy chọn khác: trước khi hiển thị bộ điều khiển phương thức, hãy chụp ảnh màn hình của toàn bộ cửa sổ. Chèn hình ảnh đã chụp vào UIImageView và thêm chế độ xem hình ảnh vào chế độ xem của bộ điều khiển mà bạn sắp hiển thị. Sau đó gửi trở lại. Chèn một chế độ xem khác phía trên chế độ xem hình ảnh (nền đen, alpha 0,7). Hiển thị bộ điều khiển phương thức của bạn và có vẻ như nó trong suốt. Chỉ cần thử nó trên iPhone 4 chạy iOS 4.3.1. Giống như sự quyến rũ.


tốt, tôi thực hiện điều này, nó là tuyệt vời cho tôi. thêm mã của tôi theo khái niệm này.
Ishu

Không ai nói rằng nó sẽ dễ dàng! :-)
Krumelur

Bạn sẽ hỗ trợ xoay thiết bị như thế nào với cách tiếp cận này?
Kyle Clegg

10

điều này khá cũ, nhưng tôi đã giải quyết được vấn đề tương tự như sau: Vì tôi cần trình bày bộ điều khiển điều hướng trong iPhone, nên việc thêm một chế độ xem phụ không phải là một giải pháp khả thi.

Vì vậy, những gì tôi đã làm:

1) Trước khi trình bày bộ điều khiển chế độ xem, hãy chụp ảnh màn hình hiện tại của bạn:

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

2) Tạo bộ điều khiển chế độ xem bạn muốn trình bày và thêm nền làm chế độ xem phụ, gửi nó trở lại.

UIViewController * presentingVC = [UIViewController new];
UIImageView * backgroundImageOfPreviousScreen = [[UIImageView alloc] initWithImage:backgroundImage];
[presentingVC.view addSubview:backgroundImageOfPreviousScreen];
[presentingVC.view sendSubviewToBack:backgroundImageOfPreviousScreen];

3) Trình bày bộ điều khiển chế độ xem của bạn, nhưng trước đó trong bộ điều khiển chế độ xem mới, hãy thêm một chế độ xem trong suốt trong viewDidLoad (tôi đã sử dụng ILTranslucentView)

-(void)viewDidLoad
{
    [super viewDidLoad];
    ILTranslucentView * translucentView = [[ILTranslucentView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:translucentView];
    [self.view sendSubviewToBack:translucentView];
}

Và đó là tất cả!


Tuyệt vời. Tất cả đều hoạt động tốt bên cạnh chế độ xem mờ khiến ảnh chụp màn hình biến mất.
Michal Shatz

Đây là một giải pháp tuyệt vời! Tốt hơn là giữ mã bộ điều khiển cho cửa sổ bật lên tách biệt với bộ điều khiển chế độ xem chính.
1kmonkies

Đối với tôi làm việc nhưng thiết lập nền phải được trong viewWillAppear
Leszek Zarna

5

Tôi đã viết ra những phát hiện của mình về điều này trong một câu hỏi khác , nhưng ý chính của nó là bạn phải sử dụng modalPresentationStyle = UIModalPresentationCurrentContextbất cứ thứ gì sở hữu toàn màn hình vào lúc này. Hầu hết thời gian, đó là bất cứ điều gì là rootViewController của [UIApplication sharedApplication] .delegate.window. Nó cũng có thể là một UIViewController mới được giới thiệu cùng modalPresentationStyle = UIModalPresentationFullScreen.

Vui lòng đọc bài đăng khác chi tiết hơn của tôi nếu bạn đang thắc mắc cách tôi giải quyết vấn đề này một cách cụ thể. Chúc may mắn!


5

Điều này dường như đã bị hỏng trong IOS 8, tôi đang sử dụng bộ điều khiển điều hướng và ngữ cảnh đang được hiển thị là ngữ cảnh menu Điều hướng mà trong trường hợp của chúng tôi là bộ điều khiển Menu trượt.

Chúng tôi đang sử dụng pod 'TWTSideMenuViewController', '0.3' vẫn chưa kiểm tra xem đây có phải là sự cố với thư viện hay phương pháp được mô tả ở trên.


5

Điều này đã làm việc với tôi trong iOS 8-9:

1- Đặt nền của bộ điều khiển chế độ xem của bạn với một alpha

2- thêm mã này:

TranslucentViewController *tvc = [[TranslucentViewController alloc] init];
self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[tvc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

[self.navigationController presentViewController:tvc animated:YES completion:nil];

4

Tôi biết đây là câu hỏi khá cũ. Tôi đã bị mắc kẹt về vấn đề này và tôi có thể nhận được một khách hàng tiềm năng từ chủ đề này. Vì vậy, đặt ở đây như thế nào tôi đã làm việc :). Tôi đang sử dụng bảng phân cảnh và tôi đã xác định được ViewController sẽ được trình bày. Bộ điều khiển chế độ xem có màu nền trong suốt. Bây giờ trong trình kiểm tra Thuộc tính của segue, tôi đặt bản trình bày thành "Theo ngữ cảnh hiện tại". Và nó hoạt động với tôi. Tôi đang phát triển cho iPhone.

Kiểm tra thuộc tính của segue


cảm ơn, cũng hoạt động bằng cách thiết lập UIModalPresentationStyle.OverCurrentContext lập trình
guoleii

3

Tôi đã tạo thư viện soruce mở MZFormSheetController để trình bày trang biểu mẫu phương thức trên UIWindow bổ sung. Bạn có thể sử dụng nó để trình bày bộ điều khiển chế độ xem trong suốt, thậm chí điều chỉnh kích thước của bộ điều khiển chế độ xem được trình bày.


Bạn có thể giải thích làm thế nào để sử dụng nó? Bởi vì khi tôi cố gắng gọi mã, nó gây ra SIGABRT.
Matrosov Alexander

3

Trong điều kiện của tôi, tôi đang xem trên cùng một viewController. Vì vậy, hãy tạo một bộ điều khiển chế độ xem mới để giữ UIView. Làm cho chế độ xem đó trong suốt bằng cách đặt thuộc tính alpha của nó. Sau đó, trên một nút bấm, tôi đã viết mã này. Nó có vẻ tốt.

UIGraphicsBeginImageContext(objAppDelegate.window.frame.size);
    [objAppDelegate.window.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();



    UIViewController *controllerForBlackTransparentView=[[[UIViewController alloc] init] autorelease];
    [controllerForBlackTransparentView setView:viewForProfanity];

    UIImageView *imageForBackgroundView=[[UIImageView alloc] initWithFrame:CGRectMake(0, -20, 320, 480)];
    [imageForBackgroundView setImage:viewImage];

    [viewForProfanity insertSubview:imageForBackgroundView atIndex:0];

    [self.navigationController presentModalViewController:controllerForBlackTransparentView animated:YES];

Và nó cho thấy những gì tôi muốn. hy vọng nó sẽ giúp một số người.


2

Đây là một danh mục tôi đã tạo sẽ giải quyết vấn đề.

    //
    //  UIViewController+Alerts.h
    //

    #import <UIKit/UIKit.h>

    @interface UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated;
    - (void)dismissAlertViewControllerAnimated:(BOOL)animated;

    @end


    //
    //  UIViewController+Alerts.m
    //

    #import "UIViewController+Alerts.h"

    @implementation UIViewController (Alerts)

    - (void)presentAlertViewController:(UIViewController *)alertViewController animated:(BOOL)animated
    {
            // Setup frame of alert view we're about to display to just off the bottom of the view
            [alertViewController.view setFrame:CGRectMake(0, self.view.frame.size.height, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];

            // Tag this view so we can find it again later to dismiss
            alertViewController.view.tag = 253;

            // Add new view to our view stack
            [self.view addSubview:alertViewController.view];

            // animate into position
            [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                    [alertViewController.view setFrame:CGRectMake(0, (self.view.frame.size.height - alertViewController.view.frame.size.height) / 2, alertViewController.view.frame.size.width, alertViewController.view.frame.size.height)];
            }];      
    }

    - (void)dismissAlertViewControllerAnimated:(BOOL)animated
    {
            UIView *alertView = nil;

            // find our tagged view
            for (UIView *tempView in self.view.subviews)
            {
                    if (tempView.tag == 253)
                    {
                            alertView = tempView;
                            break;
                    }
            }

            if (alertView)
            {
                    // clear tag
                    alertView.tag = 0;

                    // animate out of position
                    [UIView animateWithDuration:(animated ? 0.5 : 0.0) animations:^{
                            [alertView setFrame:CGRectMake(0, self.view.frame.size.height, alertView.frame.size.width, alertView.frame.size.height)];
                    }];      
            }
    }

    @end

4
FYI, không cần phải tự mình lặp lại các lượt xem phụ trong phương pháp loại bỏ. Khung sẽ làm điều đó cho bạn với [self.view viewWithTag: 253];
SteveB

Danh mục của Dave Wood trong ví dụ này hiển thị chế độ xem của bạn như hiện tại. Vì vậy, bạn cũng phải đặt nền của cài đặt Alpha của chế độ xem xib của bạn thấp hơn 1 để có được hiệu ứng mờ.
Basil Bourque,

Danh mục này gặp sự cố khi trình bày trên một chế độ xem có thể cuộn như chế độ xem bảng: Thao tác cuộn. Điều đó thật xấu. Người dùng có thể cuộn chế độ xem đã trình bày ra ngoài màn hình. Nội dung của chế độ xem trình bày bên dưới hiển thị trên màn hình.
Basil Bourque,

Tôi đã cập nhật danh mục này kể từ khi cập nhật. Bạn có thể lấy mã tại đây: gist.github.com/4423365 . Tôi sử dụng nó trên các chế độ xem bảng và chế độ xem bộ sưu tập mà không có vấn đề cuộn như bạn mô tả.
Dave Wood,

2

Sau rất nhiều nghiên cứu, có vẻ như điều này sẽ giải quyết được vấn đề của chúng tôi và phục vụ mục đích của chúng tôi.

tạo một segue từ VC nguồn đến VC đích với một định danh.

ví dụ: "goToDestinationViewController" được để làm cho cuộc sống trở nên dễ dàng, chúng ta hãy coi bộ điều khiển chế độ xem hiện tại, tức là bộ điều khiển bạn muốn đằng sau chế độ xem trong suốt của mình là nguồn và đích là đích

Bây giờ trong nguồn VC trong viewDidLoad: hoặc xem

performSegueWithIdentifier("goToDestinationViewController", sender: nil)

tốt, chúng ta đã đi được một nửa chặng đường. Bây giờ đi đến bảng phân cảnh của bạn. Nhấp vào segue. sẽ trông như thế này: segue

thay đổi các tùy chọn cho những gì được hiển thị.

Bây giờ là giải pháp thực sự.

trong viewDidLoad của bộ điều khiển chế độ xem đích của bạn, hãy thêm mã này.

self.modalPresentationStyle = .Custom

...................................................... ....................... RỒI DỄ DÀNG ... .........................................


1
Cài đặt self.modalPresentationStyle = .customhoạt động đối với tôi trong việc trình bày theo phương thức bộ điều khiển chế độ xem thực tế với nền trong suốt trong Swift 3, Xcode 8. Vấn đề duy nhất là nếu bộ điều khiển chế độ xem trình bày được nhúng trong bộ điều khiển thanh tab, thanh tab sẽ hiển thị phía trước trong suốt chế độ xem nền.
mtso

Vì vậy - nếu thanh tab đang được sử dụng - thì bộ điều khiển chế độ xem trình bày tabBarController.tabBar.isHiddensẽ được đặt thành true.
mtso

1

Cách thay thế là sử dụng "chế độ xem vùng chứa". Chỉ cần tạo alpha dưới 1 và nhúng với seque. XCode 5, nhắm mục tiêu iOS7.

không thể hiện hình ảnh, không đủ danh tiếng)))

Chế độ xem vùng chứa có sẵn từ iOS6.


1

Mã này hoạt động tốt trên iPhone dưới iOS6 và iOS7:

presentedVC.view.backgroundColor = YOUR_COLOR; // can be with 'alpha'
presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
[presentingVC presentViewController:presentedVC animated:YES completion:NULL];

Nhưng theo cách này, bạn sẽ mất hoạt ảnh 'trượt từ dưới lên'.


Điều này không hiệu quả với tôi trên iPhone. Khung cảnh bên dưới vẫn biến mất. Tôi tin rằng modalPresentationStyle chỉ áp dụng cho iPad.
jessepinho

Nếu bạn muốn, tôi có thể gửi cho bạn màn hình của hiệu ứng kết quả. Có thể có gì đó sai trong quá trình triển khai của bạn.
malex

À ... đó là vì tôi không biết rằng bộ điều khiển chế độ xem phải ở chế độ toàn màn hình. (Xem bình luận của anh T.)
jessepinho

1

Tôi đã tìm thấy giải pháp thanh lịch và đơn giản này cho iOS 7 trở lên!

Đối với iOS 8, Apple đã thêm UIModalPresentationOverCurrentContext, nhưng nó không hoạt động cho iOS 7 trở về trước, vì vậy tôi không thể sử dụng nó cho trường hợp của mình.

Vui lòng tạo danh mục và đặt mã sau.

tệp .h

typedef void(^DismissBlock)(void);

@interface UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion;

@end

tệp .m

#import "UIViewController+Ext.h"

@implementation UIViewController (Ext)

- (DismissBlock)presentController:(UIViewController *)controller
              withBackgroundColor:(UIColor *)color
                         andAlpha:(CGFloat)alpha
                presentCompletion:(void(^)(void))presentCompletion
{
    controller.modalPresentationStyle = UIModalPresentationCustom;

    UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
    __block UIView *overlay = [[UIView alloc] initWithFrame:keyWindow.bounds];
    if (color == nil) {
        color = [UIColor blackColor];
    }
    overlay.backgroundColor = color;
    overlay.alpha = alpha;

    if (self.navigationController != nil) {
        [self.navigationController.view addSubview:overlay];
    }
    else if (self.tabBarController != nil) {
        [self.tabBarController.view addSubview:overlay];
    }
    else {
        [self.view addSubview:overlay];
    }

    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:controller
                       animated:true
                     completion:presentCompletion];

    DismissBlock dismissBlock = ^(void) {
        [self dismissViewControllerAnimated:YES completion:nil];
        [UIView animateWithDuration:0.25
                         animations:^{
                             overlay.alpha = 0;
                         } completion:^(BOOL finished) {
                             [overlay removeFromSuperview];
                         }];
    };
    return dismissBlock;
}

@end

Lưu ý: nó cũng hoạt động cho navigationContoller, tabBarController.

Ví dụ về cách sử dụng:

       // Please, insure that your controller has clear background
       ViewController *controller = [ViewController instance];
        __block DismissBlock dismissBlock = [self presentController:controller
                                                withBackgroundColor:[UIColor blackColor]
                                                           andAlpha:0.5
                                                  presentCompletion:nil];
        // Supposed to be your controller's closing callback
        controller.dismissed = ^(void) {
            dismissBlock();
        };

Hãy tận hưởng nó! và vui lòng để lại một số phản hồi.


0

Đây là cách tốt nhất và sạch nhất mà tôi tìm thấy cho đến nay:

@protocol EditLoginDelegate <NSObject>

- (void)dissmissEditLogin;

@end

- (IBAction)showtTransparentView:(id)sender {

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"foo bar"
                                                         delegate:self
                                                cancelButtonTitle:@"cancel"
                                           destructiveButtonTitle:@"destructive"
                                                otherButtonTitles:@"ok", nil];

    [actionSheet showInView:self.view];

}

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet{

    UIStoryboard *loginStoryboard     = [UIStoryboard storyboardWithName:@"Login" bundle:nil];
    self.editLoginViewController      = [loginStoryboard instantiateViewControllerWithIdentifier:@"EditLoginViewController"];

    self.editLoginViewController.delegate = self;

    [self.editLoginViewController viewWillAppear:NO];
    [actionSheet addSubview:self.editLoginViewController.view];
    [self.editLoginViewController viewDidAppear:NO];
}


0

Tôi cố gắng sử dụng nhiều phương pháp để giải quyết nhưng vẫn không thành công, đoạn mã sau được thực hiện cuối cùng.

Giải pháp của Swift:

// A.swift init method
modalPresentationStyle = .currentContext // or overCurrentContent
modalTransitionStyle = .crossDissolve // dissolve means overlay

thì trong B view controller :

// B.swift
let a = A()
self.present(a, animated: true, completion: nil)

Bạn cũng phải làm cho backgroundColor của khung nhìn ViewController trong suốt. view.backgroundColor = UIColor.clear
Michael Henry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.