iOS: Chế độ ViewContoder với nền trong suốt


180

Tôi đang cố gắng trình bày một bộ điều khiển xem một cách vừa phải, với một nền trong suốt. Mục tiêu của tôi là để cho cả chế độ xem trình bày và trình bày chế độ xem được hiển thị cùng một lúc. Vấn đề là, khi hoạt ảnh trình bày kết thúc, chế độ xem trình điều khiển trình bày biến mất.

- (IBAction)pushModalViewControllerButtonPressed:(id)sender
{
    ModalViewController *modalVC = [[ModalViewController alloc] init];
    [self presentViewController:modalVC animated:YES completion:nil];
}

Tôi biết tôi chỉ có thể thêm chế độ xem dưới dạng một cuộc phỏng vấn, nhưng tôi muốn tránh giải pháp này vì một số lý do. Làm thế nào tôi có thể sửa chữa nó?


4
@TheKing Âm thanh như Michael, giống như tôi, muốn chế độ xem ở dạng mờ, xuất hiện dưới dạng lớp gel lơ lửng trên chế độ xem chính (trình bày). Tạo cảm giác của người dùng ở trong bối cảnh hiện tại trong khi thực hiện cài đặt nhanh, trái ngược với việc chuyển sang một số chức năng chính khác (trong một chế độ xem riêng).
Basil Bourque

Đâ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

Xem câu trả lời của tôi tại đây stackoverflow.com/a/29794201/1606125 cho iOS 8
Pankaj Wadhwa

phiên bản nhanh chóng tại đây stackoverflow.com/a/34578402/3380878
Mojtabye

1
Đối với iOS 10 đang hoạt động UIModalPftimeationOverFullScreen như inigo333 được đề cập dưới đây.
Josef Rysanek

Câu trả lời:


97

Mã sau đây chỉ hoạt động trên iPad.

self.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentModalViewController:modalVC animated:YES];

Tôi sẽ đi với việc thêm một cái nhìn phụ.

Đây là một cuộc thảo luận rất tốt. Nhìn vào các ý kiến ​​cụ thể. Không chỉ là câu trả lời.

Chế độ xem

Nếu tôi là bạn, tôi sẽ không làm điều đó. Tôi sẽ thêm một cái nhìn phụ và làm điều đó. Nó dường như cho tôi một sự kiểm soát tốt hơn đối với mọi thứ.

BIÊN TẬP:

Như Paul Linsay đã đề cập, kể từ iOS 8, tất cả những gì cần thiết là UIModalPresentationOverFullScreendành cho modalPftimeationStyle của ViewContoder được trình bày. Điều này cũng sẽ bao gồm các nút navigationBar và tabBar.


18
làm việc trên iOS 7 và cũng trên iPhone, điều này là bạn phải xác định modalPresentationStyle = UIModalPresentationCurrentContexttrên người dẫn chương trình điều khiển xem, và không nằm trong giới một.
red8484

6
Có, nó hoạt động nhưng CHỈ nếu bạn đặt thứ này ở mức cao hơn ViewController trong cấu trúc phân cấp chế độ xem của bạn. (ví dụ: a NavigationControllerhoặc ví dụ của trình điều khiển xem trình đơn slide của bạn chẳng hạn).
iGranDav

4
Thật kỳ lạ, trong trường hợp của tôi, nó chỉ hoạt động sau khi đặt kiểu modal thành UIModalPresentationCustom, và chỉ khi nó được đặt đúng trước presentViewControllerchứ không phải trong viewDidLoad.
mojuba

5
Vì iOS 8, tất cả những gì cần thiết là UIModalPftimeationOverFullScreen cho modalPftimeationStyle của ViewContoder đang được trình bày.
Paul Linsay

1
Sau khoảng 1000 lần thử, tôi nhận ra bạn cần phải đặt modalPresentationStyle trướcviewDidLoad . Tôi đã làm nó trong các nhà xây dựng và nó đã làm việc.
uốn cong

186

Đối với những người đang cố gắng để điều này hoạt động trong iOS 8, cách "được Apple chấp thuận" để hiển thị bộ điều khiển chế độ xem trong suốt bằng cách đặt modalPresentationStyle trên bộ điều khiển ed hiện tại thành UIModalPresentationOverCurrentContext .

Điều này có thể được thực hiện bằng mã hoặc bằng cách đặt các thuộc tính của segue trong bảng phân cảnh.

Từ tài liệu UIViewControll:

UIModalPftimeationOverCienContext

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

Khi trình bày bộ điều khiển chế độ 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 đổi là UIModalTransitionStyleCoverV vertical. Cố gắng sử dụng một kiểu chuyển tiếp khác nhau gây ra 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 đổi cuộn tròn một phần) nếu bộ điều khiển xem cha không ở trong cửa sổ bật lên.

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

https://developer.apple.com/documentation/uikit/uiviewcontroll

Video 'Xem tiến bộ điều khiển trong iOS 8' từ WWDC 2014 đi sâu vào chi tiết này.

Ghi chú:

  • Hãy chắc chắn cung cấp cho trình điều khiển chế độ xem được trình bày của bạn một màu nền rõ ràng, kẻo nó không thực sự được nhìn xuyên qua!
  • Bạn phải thiết lập điều này trước khi trình bày tức là cài đặt tham số này trong viewDidLoadphần trình bàyViewControll sẽ không có bất kỳ ảnh hưởng nào

32
Lưu ý - Nó xuất hiện mục tiêu mà bạn cần đặt modalPftimeationStyle đã thay đổi. Ví dụ, trong iOS 7, để làm cho điều này hoạt động, tôi cần phải đặt modalPftimeationStyle của (các) Trình điều khiển Chế độ xem đang cố mở chế độ cho UIModalPftimeationCienContext . Tuy nhiên, để làm cho điều này hoạt động trong iOS8, tôi cần phải đặt modalPftimeationStyle của chế độ xem phương thức sẽ được hiển thị thành UIModalPftimeationOverCienContext .
u2Fan

1
Nếu sử dụng segues trong bảng phân cảnh của bạn, bạn phải đặt kiểu trình bày ở đó. Ít nhất đây là những gì làm việc cho tôi.
Julian B.

Tôi đã thêm ba dòng này trong phương thức init trong trình điều khiển khung nhìn được trình bày và hoạt động như một nét quyến rũ: self.providesPftimeationContextTransitionStyle = YES; self.definesPftimeationContext = CÓ; [self setModalPftimeationStyle: UIModalPftimeationOverCienContext];
inigo333

2
Trên iOS 8+, tôi đã phải trình bày một phương thức từ UINavestionControll để trình bày từ một đứa trẻ không cung cấp cho tôi những gì tôi cần. Thay vào đó, sourceVCself.navigationController. Ngoài ra, chỉ sau khi đặt kiểu trình bày mục tiêu là tùy chỉnh, tôi mới có thể nhìn xuyên qua nó. [sourceVC setModalPresentationStyle:UIModalPresentationCurrentContext];, [targetVC setModalPresentationStyle:UIModalPresentationCustom];Hy vọng nó sẽ giúp được ai đó.
devdc

Lưu ý - Gọi presentedVC.modalPresentationStyle = UIModalPresentationOverCurrentContexttrong VC trình bày . Không hoạt động trong các PVC được trình bày. Tin tôi đi, tôi đã thử.
smileham

104

Trong iOS 8.0 trở lên, có thể được thực hiện bằng cách đặt thuộc tính modalPftimeationStyle thành UIModalPftimeationOverCienContext

//Set property **definesPresentationContext** YES to avoid presenting over presenting-viewController's navigation bar

self.definesPresentationContext = YES; //self is presenting view controller
presentedController.view.backgroundColor = [YOUR_COLOR with alpha OR clearColor]
presentedController.modalPresentationStyle = UIModalPresentationOverCurrentContext;

[self presentViewController:presentedController animated:YES completion:nil];

Xem hình ảnh đính kèm


5
Đây là giải pháp duy nhất tôi có thể làm việc. Rất đơn giản là tốt. Chỉ cần thêm phần này vào VC trình bày của bạn trước khi phân biệt phương thức.
Siriss

1
Xcoe 9.2 / iOS 11.2 nhanh chóng .custom.overFullScreenhoạt động.
William Hu

Và dường như nếu bạn đặt .overFullScreentrình điều khiển chế độ xem hiện tại viewWillAppearsẽ không được gọi.
William Hu

Một điều nữa, presentedController.view.backgroundColor = #color#cần được viết bằng presentedController's viewDidLoad, nếu không presentedControllercuộc sống của bị gián đoạn.
DawnSong

44

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];

Trong trường hợp này, bạn bỏ lỡ hình ảnh động trượt. Để giữ lại hình ảnh động, bạn vẫn có thể sử dụng tiện ích mở rộng "không thanh lịch" sau:

[presentingVC presentViewController:presentedVC animated:YES completion:^{
    [presentedVC dismissViewControllerAnimated:NO completion:^{
        presentingVC.modalPresentationStyle = UIModalPresentationCurrentContext;
        [presentingVC presentViewController:presentedVC animated:NO completion:NULL];
    }];
}];

Nếu PresentingV của chúng tôi được đặt bên trong UINavestionContaptor hoặc UITabbarContoder, bạn cần phải hoạt động với các bộ điều khiển đó như trình bàyVC.

Hơn nữa, trong iOS7, bạn có thể thực hiện UIViewControllerTransitioningDelegategiao thức chuyển đổi hoạt hình tùy chỉnh . Tất nhiên, trong trường hợp này bạn có thể có được nền trong suốt

@interface ModalViewController : UIViewController <UIViewControllerTransitioningDelegate>

Đầu tiên, trước khi trình bày bạn phải thiết lập modalPresentationStyle

modalViewController.modalPresentationStyle = UIModalPresentationCustom;

Sau đó, bạn phải thực hiện hai phương thức giao thức

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    CustomAnimatedTransitioning *transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = YES;
    return transitioning;
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CustomAnimatedTransitioning * transitioning = [CustomAnimatedTransitioning new];
    transitioning.presenting = NO;
    return transitioning;
}

Điều cuối cùng là xác định chuyển đổi tùy chỉnh của bạn trong CustomAnimatedTransitioninglớp

@interface CustomAnimatedTransitioning : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic) BOOL presenting;
@end

@implementation CurrentContextTransitionAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    return 0.25;
}

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext 
{
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    if (self.presenting) {
        // custom presenting animation
    }
    else {
        // custom dismissing animation
    }
}

7
Khẳng định công trình này. LƯU Ý rằng nếu viewContoder của bạn nằm trong navigationContoder thì hãy đảm bảo rằng nó modalPresentationStylecũng được đặt!
mxcl

Tôi nghĩ rằng trong những trường hợp phổ biến nhất, nên coi bộ điều khiển điều hướng của bạn là trình bày PVC.
malex 14/12/13

Có, sử dụng modalPftimeationStyle này để có thể trình bày hoạt hình ((
malex

2
@alex vâng, nó hoạt động rất tiếc: lỗi của tôi là đặt modalPftimeationStyle thành UIModalPftimeationCảnContext cho trình bày thay vì prenstingVC.
tiguero

5
@mxcl Và nếu điều hướng viewContoder của bạn nằm trong tabBarContoder thì hãy đảm bảo modalPftimeationStyle của nó cũng được đặt;)
Thomas CG de Vilhena

21

Tôi đã vật lộn một chút với Trình tạo giao diện của XCode 7 để đặt Kiểu trình bày như @VothyGopalTewari đề xuất. Trong phiên bản này, dường như không có Over Current Contexthoặc Over Full Screenchế độ trình bày cho segue. Vì vậy, để làm cho nó hoạt động, tôi đặt chế độ thành Default:

nhập mô tả hình ảnh ở đây với nhập mô tả hình ảnh ở đây

Ngoài ra, tôi đặt chế độ trình bày của trình điều khiển chế độ xem được trình bày thành Over Full Screen:

nhập mô tả hình ảnh ở đây


Điều này làm việc cho tôi, không cần mã. Tôi đang sử dụng Xcode 7.2, swift và mục tiêu là iOS 8.0
LightMan

Điều này làm việc cho tôi quá. +1 cho câu trả lời đúng. Cảm ơn :)
Augustine PA

Câu trả lời tốt nhất ở đây!
shinyuX

1
Không có mã = ​​Câu trả lời hay nhất. Bastian thắng trò chơi này. Xin vui lòng tất cả +1 câu trả lời này.
GeneCode

Câu trả lời này đã có hiệu quả .. dành hơn một giờ cho việc này
user578386

18

Tạo một segue để trình bày một cách vừa phải và đặt thuộc tính Presentation của segue đó trong bối cảnh hiện tại, nó sẽ hoạt động 100%

nhập mô tả hình ảnh ở đây


3
Tôi ngưỡng mộ những người đầu hàng 100%, nó đã làm việc! Điều quan trọng là áp dụng nó trên segue. Cảm ơn bạn rất nhiều
Badr

Nếu bạn không có nút nối của mình được nối với một nút và bạn đang gọi nó bằng lập trình thì hãy đảm bảo đặt một mã định danh và gọi PerformanceSegueWithIdentifier thay vì PresentViewContoder
user3344977

1
Tôi đã thử tất cả các câu trả lời khác, nhưng đây là câu trả lời duy nhất phù hợp với tôi trong iOS9.
endavid

14

PresentViewControll với nền trong suốt - trong iOS 8 và iOS 9

MYViewController *myVC = [self.storyboard   instantiateViewControllerWithIdentifier:@"MYViewController"];
    myVC.providesPresentationContextTransitionStyle = YES;
    myVC.definesPresentationContext = YES;
    [myVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    [self.navigationController presentViewController:myVC animated:YES completion:nil];

Và trong MYViewControll, đặt màu nền đen và giảm độ mờ


12

Đó là một chút cách hacky, nhưng đối với tôi mã này hoạt động (iOS 6):

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[self presentViewController:self.signInViewController animated:YES completion:^{
    [self.signInViewController dismissViewControllerAnimated:NO completion:^{
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
        [self presentViewController:self.signInViewController animated:NO completion:nil];
        appDelegate.window.rootViewController.modalPresentationStyle = UIModalPresentationFullScreen;

    }];
}];

Mã này cũng hoạt động trên iPhone


Cảm ơn - đây chính xác là những gì tôi cần - hiển thị màn hình "Trợ giúp" ban đầu ở trên cùng của Trang chủ chính. Xinh đẹp!
Matt H

1
Hôm nay, tôi dành gần 3 giờ để duyệt và tìm kiếm giải pháp hoạt động cho cả iOS7 và iOS8. Xem xét thực tế câu trả lời này đã 1,5 năm tuổi và tôi đang sử dụng ECSlidingViewControll, đây là giải pháp duy nhất có hiệu quả! Cảm ơn @Mak.
Centurion

Hoàn hảo. Ngoài ra, nếu bạn không quan tâm đến hoạt hình, 3 dòng trong hoàn thành bên trong hoạt động hoàn hảo Cảm ơn!
RasTheDestroyer

Sau 3 giờ dành mà không có thành công nào tìm thấy điều này, chúc mừng, ước gì tôi có thể bỏ phiếu nhiều hơn: D
alessioarsuffi

11

Thể loại này làm việc cho tôi (ios 7, 8 và 9)

Tập tin H

@interface UIViewController (navigation)
- (void) presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
@end

Tập tin M

@implementation UIViewController (navigation)
- (void)presentTransparentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion
{
    if(SYSTEM_VERSION_LESS_THAN(@"8.0")) {
        [self presentIOS7TransparentController:viewControllerToPresent withCompletion:completion];

    }else{
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
         [self presentViewController:viewControllerToPresent animated:YES completion:completion];
    }
}
-(void)presentIOS7TransparentController:(UIViewController *)viewControllerToPresent withCompletion:(void(^)(void))completion
{
    UIViewController *presentingVC = self;
    UIViewController *root = self;
    while (root.parentViewController) {
        root = root.parentViewController;
    }
    UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
    root.modalPresentationStyle = UIModalPresentationCurrentContext;
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
        root.modalPresentationStyle = orginalStyle;
    }];
}
@end

1
Tôi đã kiểm tra tất cả câu trả lời .. nhưng đối với tôi câu trả lời của bạn là công việc hoàn hảo .. "+1" cho việc này. @Ted
g212ss

1
Tôi nghĩ rằng tôi không thể tìm thấy một giải pháp. Cảm ơn rất nhiều!
CopperCash

10

Giải pháp cho câu trả lời này bằng cách sử dụng swift sẽ như sau.

let vc = MyViewController()
vc.view.backgroundColor = UIColor.clear // or whatever color.
vc.modalPresentationStyle = .overCurrentContext
present(vc, animated: true, completion: nil)

9

Nếu bạn đang sử dụng Storyboard, bạn có thể làm theo bước này:

  1. Thêm trình điều khiển xem (V2), thiết lập giao diện người dùng theo cách bạn muốn
  • thêm một UIView - đặt nền thành màu đen và độ mờ thành 0,5
  • thêm một UIView khác (2) - sẽ đóng vai trò là cửa sổ bật lên của bạn (Xin lưu ý rằng UIView và UIView (2) phải có cùng cấp độ / phân cấp. ảnh hưởng đến UIView (2))
  1. Hiện tại V2 Modally

  2. Nhấp vào segue. Trong thanh tra thuộc tính, Đặt bản trình bày là trên toàn màn hình . Xóa hình ảnh động nếu bạn thích

Bảng phân cảnh

  1. Chọn V2. Trong thanh tra thuộc tính, Đặt bản trình bày là trên toàn màn hình . Kiểm tra xác định bối cảnh và cung cấp bối cảnh

Bảng phân cảnh

  1. Chọn MainView của V2 của bạn (Xin vui lòng kiểm tra hình ảnh). Đặt màu nền thành Màu rõ ràng

Bảng phân cảnh


6

Tôi đã thêm ba dòng này trong phương thức init trong trình điều khiển khung nhìn được trình bày và hoạt động như một nét quyến rũ:

self.providesPresentationContextTransitionStyle = YES;
self.definesPresentationContext = YES;
[self setModalPresentationStyle:UIModalPresentationOverCurrentContext];

EDIT (hoạt động trên iOS 9.3):

self.modalPresentationStyle = UIModalPresentationOverFullScreen;

Theo tài liệu:

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

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


1
Hoạt động trên iOS 10.2.
Josef Rysanek

4

Cách khác là sử dụng "khung nhìn container". Chỉ cần tạo alpha dưới 1 và nhúng với seque. XCode 5, mục tiêu iOS7. Đã thử nghiệm trên iPhone.

nhập mô tả hình ảnh ở đây

Chế độ xem container có sẵn từ iOS6. Liên kết đến bài viết trên blog về điều đó.


3

Tôi đã tạo một đối tượng để xử lý việc trình bày cái mà tôi gọi là "phương thức chồng lên", nghĩa là nó giữ lại chế độ xem của nền và cho phép bạn có một phương thức với nền trong suốt.

Nó có một phương thức đơn giản để thực hiện điều này:

- (void)presentViewController:(UIViewController *)presentedViewController
       fromViewController:(UIViewController *)presentingViewController
{
    presentedViewController.modalPresentationStyle = UIModalPresentationCustom;
    presentedViewController.transitioningDelegate = self;
    presentedViewController.modalPresentationCapturesStatusBarAppearance = YES;

    [presentedViewController setNeedsStatusBarAppearanceUpdate];

    [presentingViewController presentViewController:presentedViewController
                                       animated:YES
                                     completion:nil];
}

Điều quan trọng là phải đặt thuộc modalPresentationCapturesStatusBarAppearancetính YESvà buộc xuất hiện thanh trạng thái để cập nhật, nếu trình điều khiển chế độ xem được trình bày của bạn có khácpreferredStatusBarStyle .

Đối tượng này nên có một @property (assign, nonatommic) isPresenting

Bạn muốn đối tượng này tuân thủ UIViewControllerAnimatedTransitioningvà các UIViewControllerTransitioningDelegategiao thức và thực hiện các phương thức sau:

- (id)animationControllerForPresentedController:(UIViewController *)presented
                           presentingController:(UIViewController *)presenting
                               sourceController:(UIViewController *)source
{
    self.isPresenting = YES;

    return self;
}

- (id)animationControllerForDismissedController:(UIViewController *)dismissed
{
    self.isPresenting = NO;

    return self;
}

và:

- (NSTimeInterval)transitionDuration:(id)transitionContext
{
    return 0.25;
}

- (void)animateTransition:(id)transitionContext
{
    UIViewController* firstVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIViewController* secondVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView* containerView = [transitionContext containerView];
    UIView* firstView = firstVC.view;
    UIView* secondView = secondVC.view;

    if (self.isPresenting) {
        [containerView addSubview:secondView];
        secondView.frame = (CGRect){
            containerView.frame.origin.x,
            containerView.frame.origin.y + containerView.frame.size.height,
            containerView.frame.size
        };

        firstView.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        [UIView animateWithDuration:0.25 animations:^{
            secondView.frame = containerView.frame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
        } else {
        [UIView animateWithDuration:0.25 animations:^{
            firstView.frame = (CGRect){
                containerView.frame.origin.x,
                containerView.frame.origin.y + containerView.frame.size.height,
                containerView.frame.size
        };

        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

Điều này thực hiện một hoạt hình trượt từ dưới lên bắt chước hoạt hình phương thức mặc định, nhưng bạn có thể làm cho nó bất cứ điều gì bạn muốn.

Điều quan trọng là chế độ xem của trình điều khiển trình bày sẽ vẫn ở phía sau, cho phép bạn tạo hiệu ứng trong suốt.

Giải pháp này hoạt động cho iOS 7+


Cảm ơn câu trả lời của bạn.
Salman Khakwani

3

Một cách rất đơn giản để làm điều này ( Storyboardsví dụ sử dụng ) là:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"SomeStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SomeStoryboardViewController"];
// the key for what you're looking to do:
vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;
vc.view.alpha = 0.50f;

[self presentViewController:vc animated:YES completion:^{
    // great success
}];

Điều này sẽ trình bày một UIViewControllercách Storyboardvừa phải, nhưng với một nền mờ.


3

Làm việc cho iOS 7-10

if #available(iOS 8.0, *) {
    nextVC.modalPresentationStyle = .OverCurrentContext
    self.presentViewController(nextVC, animated: true, completion: nil)
} else {
    // Fallback on earlier version
    self.modalPresentationStyle = .Custom          
    nextVC.modalTransitionStyle = .CrossDissolve            
    self.presentViewController(nextVC, animated: false, completion: nil)
    }
}

2

Để tóm tắt tất cả các câu trả lời và nhận xét tốt ở đây và vẫn có một hình ảnh động trong khi chuyển sang cái mới của bạn, ViewControllerđây là những gì tôi đã làm: (Hỗ trợ iOS 6 trở lên)

Nếu bạn sử dụng UINavigationController\ UITabBarControllerđây là cách để đi:

    SomeViewController *vcThatWillBeDisplayed = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeVC"];

    vcThatWillBeDisplayed.view.backgroundColor = [UIColor colorWithRed: 255/255.0 green:255/255.0 blue:255/255.0 alpha:0.50];    

    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:presentedVC animated:YES completion:NULL];

Nếu bạn làm điều đó bạn sẽ mất modalTransitionStylehình ảnh động của bạn . Để giải quyết nó, bạn có thể dễ dàng thêm vào SomeViewControllerlớp của mình điều này:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.4 animations:^() {self.view.alpha = 1;}
       completion:^(BOOL finished){}];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.alpha = 0;
}

2

Tất nhiên, bạn nên đặt UIModalPftimeationCiverseContext, nhưng nơi để đặt ClearColor cũng rất quan trọng! Bạn không thể đặt nền trong chức năng viewDidLoad, đặt nó trước khi chế độ xem đã tải như trong trình điều khiển xem gốc hoặc trong chức năng init của trình điều khiển sẽ trình bày!

actionController.view.backgroundColor = [UIColor clearColor];
[self presentViewController:actionController animated:YES completion:nil];

hoặc là

- (instancetype)init {

    self = [super initWithNibName:nil bundle:nil];

    if(self) {
        self.modalPresentationStyle = UIModalPresentationOverCurrentContext;
        [self.view setBackgroundColor:[UIColor clearColor]];
    }

    return self;
}

Đây là gợi ý giúp tôi trong số tất cả những người khác. Cảm ơn bạn đã giúp đỡ.
Tomasz Nazarenko

1

Nếu bạn đang sử dụng phương thức segue, hãy đảm bảo đặt nó làm hình ảnh này (bạn có thể tắt hoạt hình nếu muốn)nhập mô tả hình ảnh ở đây


1

Một phương pháp hoàn chỉnh được thử nghiệm trên iOS 7 và iOS 8.

@interface UIViewController (MBOverCurrentContextModalPresenting)

/// @warning Some method of viewControllerToPresent will called twice before iOS 8, e.g. viewWillAppear:.
- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;

@end

@implementation UIViewController (MBOverCurrentContextModalPresenting)

- (void)MBOverCurrentContextPresentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion {
    UIViewController *presentingVC = self;

    // iOS 8 before
    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_7_1) {
        UIViewController *root = presentingVC;
        while (root.parentViewController) {
            root = root.parentViewController;
        }

        [presentingVC presentViewController:viewControllerToPresent animated:YES completion:^{
            [viewControllerToPresent dismissViewControllerAnimated:NO completion:^{
                UIModalPresentationStyle orginalStyle = root.modalPresentationStyle;
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = UIModalPresentationCurrentContext;
                }
                [presentingVC presentViewController:viewControllerToPresent animated:NO completion:completion];
                if (orginalStyle != UIModalPresentationCurrentContext) {
                    root.modalPresentationStyle = orginalStyle;
                }
            }];
        }];
        return;
    }

    UIModalPresentationStyle orginalStyle = viewControllerToPresent.modalPresentationStyle;
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;
    }
    [presentingVC presentViewController:viewControllerToPresent animated:YES completion:completion];
    if (orginalStyle != UIModalPresentationOverCurrentContext) {
        viewControllerToPresent.modalPresentationStyle = orginalStyle;
    }
}

@end

1

Swift 4.2

guard let someVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "someVC") as? someVC else {
    return
}
someVC.modalPresentationStyle = .overCurrentContext

present(someVC, animated: true, completion: nil)

0

trong appdelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[_window rootViewController]setModalPresentationStyle:UIModalPresentationCurrentContext];
    return YES;
}

trong lần đầu tiên bạn xem bộ điều khiển từ nơi bạn phải tải chế độ xem tiếp theo:

  NextViewController *customvc = [[NextViewController alloc]init];
    [self presentViewController:customvc animated:YES completion:^{

    }];

trong nextViewControll của bạn sẽ được thêm vào trong suốt:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor clearColor];
    UIView* backView = [[UIView alloc] initWithFrame:self.view.frame];
    backView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.6];
    [self.view insertSubview:backView atIndex:0];
}

0

Màn hình Đăng nhập là một phương thức, có nghĩa là nó nằm trên cùng của màn hình trước đó. Cho đến nay chúng ta có Nền mờ, nhưng nó không làm mờ bất cứ điều gì; nó chỉ là một nền màu xám.

Chúng ta cần thiết lập Modal đúng cách.

mục tiêu liên kết hình ảnh

  • Trước tiên, chúng ta cần thay đổi nền Chế độ xem của Trình điều khiển thành màu Xóa. Nó đơn giản có nghĩa là nó phải minh bạch. Theo mặc định, Chế độ xem đó có màu trắng.

  • Thứ hai, chúng ta cần chọn Phân đoạn dẫn đến màn hình Đăng nhập và trong Trình theo dõi thuộc tính, đặt Bản trình bày thành Bối cảnh hiện tại. Tùy chọn này chỉ khả dụng khi Tự động bố trí và các lớp kích thước.

mục tiêu liên kết hình ảnh


0

Set menu là modalPresentationStyleđểUIModalPresentationCustom

và đặt màu nền của trình điều khiển xem trình bày của bạn là màu rõ ràng.

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.