Hiển thị ClearColor UIViewContaptor trên UIViewContoder


150

Tôi có một UIViewControllerkhung nhìn như một khung nhìn / phương thức trên đầu của một UIViewControllerkhung nhìn khác , chẳng hạn như khung nhìn con / phương thức phải trong suốt và bất kỳ thành phần nào được thêm vào khung nhìn phụ sẽ hiển thị. Vấn đề là tôi có là subview hiển thị nền đen thay vì có ClearColor. Tôi đang cố gắng làm cho UIViewmột nền rõ ràng không màu đen. Có ai biết cái gì là sai với nó? Bất kỳ đề nghị đánh giá cao.

FirstViewControll.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];

[vc setModalPresentationStyle:UIModalPresentationFullScreen];
[self presentModalViewController:vc animated:NO];  

SecondViewControll.m

- (void)viewDidLoad 
{
     [super viewDidLoad];
     self.view.opaque = YES;
     self.view.backgroundColor = [UIColor clearColor];
}

GIẢI QUYẾT : Tôi đã sửa các vấn đề. Nó đang hoạt động rất tốt cho cả iPhone và iPad. Modal View Controller không có nền đen chỉ rõ màu / trong suốt. Điều duy nhất mà tôi cần phải thay đổi là tôi đã thay thế UIModalPresentationFullScreencho UIModalPresentationCurrentContext. Thật đơn giản!

FirstViewControll.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

THÔNG BÁO: Nếu bạn đang sử dụng một modalPresentationStyletài sản của navigationController:

FirstViewControll.m

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
vc.view.backgroundColor = [UIColor clearColor];
self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
[self presentViewController:vc animated:NO completion:nil];

THÔNG BÁO: Tin xấu là giải pháp trên không hoạt động trên iOS 7. Tin vui là tôi đã khắc phục sự cố cho iOS7! Tôi đã nhờ ai đó giúp đỡ và đây là những gì anh ấy nói:

Khi trình bày một bộ điều khiển chế độ xem một cách hợp lý, iOS sẽ loại bỏ các bộ điều khiển chế độ xem bên dưới nó khỏi hệ thống phân cấp chế độ xem trong khoảng thời gian nó được trình bày. Mặc dù chế độ xem của trình điều khiển chế độ xem được trình bày một cách minh bạch, nhưng không có gì bên dưới nó ngoại trừ cửa sổ ứng dụng có màu đen. iOS 7 đã giới thiệu một kiểu trình bày phương thức mới UIModalPresentationCustom, khiến iOS không xóa các chế độ xem bên dưới trình điều khiển chế độ xem được trình bày. Tuy nhiên, để sử dụng kiểu trình bày phương thức này, bạn phải cung cấp cho đại biểu chuyển tiếp của riêng bạn để xử lý bản trình bày và loại bỏ hình ảnh động. Điều này được phác thảo trong phần 'Chuyển đổi tùy chỉnh bằng cách sử dụng bộ điều khiển xem' từ WWDC 2013 https://developer.apple.com/wwdc/ideo/?id=218 , cũng bao gồm cách triển khai đại biểu chuyển tiếp của riêng bạn.

Bạn có thể thấy giải pháp của tôi cho vấn đề trên trong iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewControll-Transitions


1
hãy chắc chắn rằng bạn đã đặt modalPftimeationStyle của rootViewControll, nếu không nó sẽ không hoạt động
Thorsten

Vui lòng xem bình luận về câu trả lời này stackoverflow.com/a/25990081/1418457 , nó hoạt động
onmyway133

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

Tôi đã phải làm self.modalPftimeationStyle = UIModalPftimeationCienContext; với trình điều khiển khung nhìn được trình bày để làm cho nó hoạt động, không phải với trình điều khiển trình bày.
Tulleb

1
Kiểm tra câu trả lời của Brody dưới đây. modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext; sẽ giải quyết vấn đề,
GoodSp33d

Câu trả lời:


143

iOS8 +

Trong iOS8 +, giờ đây bạn có thể sử dụng modalPftimeationStyle UIModalPftimeationOverCienContext mới để trình bày một bộ điều khiển xem với nền trong suốt:

MyModalViewController *modalViewController = [[MyModalViewController alloc] init];
modalViewController.modalPresentationStyle = UIModalPresentationOverCurrentContext;           
[self presentViewController:modalViewController animated:YES completion:nil];    

5
Nên là câu trả lời được chấp nhận. Câu trả lời được chấp nhận trước đây vẫn còn hiệu lực vì lý do di sản, nhưng đây là phương pháp được đề xuất.
Tomasz Bąk

3
Nếu bạn chỉ phát triển cho ios 8, hãy đi với câu trả lời này! Nó hoạt động
Mário Carvalho

2
Điều này là tốt, nhưng không nên là dòng cuối cùng [self presentViewController:modalViewController animated:YES completion:nil];? (thay vì targetContoder)?
SuperDuperTango

3
Để thực hiện điều này cho tôi, tôi đã thêm modalViewControll.view.backgroundColor = UIColor.clearColor () cảm ơn vì giải pháp
Pramod

bất cứ ai cũng có thể cung cấp cho tôi mã cho bộ điều khiển đẩy (ý tôi là cho bộ điều khiển điều hướng).
Alok

140

GIẢI QUYẾT : Tôi đã sửa các vấn đề. Nó đang hoạt động rất tốt cho cả iPhone và iPad. Modal View Controller không có nền đen chỉ rõ màu / trong suốt. Điều duy nhất tôi cần thay đổi là tôi đã thay thế UIModalPftimeationFullScreen thành UIModalPftimeationCiverseContext. Thật đơn giản!

FirstViewControll.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

THÔNG BÁO: Nếu bạn đang sử dụng thuộc tính modalPftimeationStyle của navigationContoder:

FirstViewControll.m

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    vc.view.backgroundColor = [UIColor clearColor];
    self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;
    [self presentViewController:vc animated:NO completion:nil];

THÔNG BÁO: Tin xấu là giải pháp trên không hoạt động trên iOS 7. Tin vui là tôi đã khắc phục sự cố cho iOS7! Tôi đã nhờ ai đó giúp đỡ và đây là những gì anh ấy nói:

Khi trình bày một bộ điều khiển chế độ xem một cách hợp lý, iOS sẽ loại bỏ các bộ điều khiển chế độ xem bên dưới nó khỏi hệ thống phân cấp chế độ xem trong khoảng thời gian nó được trình bày. Mặc dù chế độ xem của trình điều khiển chế độ xem được trình bày một cách minh bạch, nhưng không có gì bên dưới nó ngoại trừ cửa sổ ứng dụng có màu đen. iOS 7 đã giới thiệu một kiểu trình bày phương thức mới, UIModalPftimeationCustom, khiến iOS không xóa các chế độ xem bên dưới trình điều khiển chế độ xem được trình bày. Tuy nhiên, để sử dụng kiểu trình bày phương thức này, bạn phải cung cấp cho đại biểu chuyển tiếp của riêng bạn để xử lý bản trình bày và loại bỏ hình ảnh động. Điều này được phác thảo trong phần 'Chuyển đổi tùy chỉnh bằng cách sử dụng bộ điều khiển xem' từ WWDC 2013 https://developer.apple.com/wwdc/ideo/?id=218 , cũng bao gồm cách triển khai đại biểu chuyển tiếp của riêng bạn.

Bạn có thể thấy giải pháp của tôi cho vấn đề trên trong iOS7: https://github.com/hightech/iOS-7-Custom-ModalViewControll-Transitions


1
self.modalPresentationStyle = UIModalPresentationCurrentContext;đã làm nó.
Adriano Lucas

4
btw .. Tôi đã quan sát thấy rằng vì self.modalPftimeationStyle = UIModalPftimeationCiverseContext; nó không trình bày modalViewControll với hình ảnh động .. có ý tưởng nào không?
Devarshi

1
@Miraaj Sau đó, thiết lập modalPftimeationStyle trở lại UIModalPftimeationFullScreen trước khi hiển thị UIViewContoder sẽ hoạt độngself.modalPresentationStyle = UIModalPresentationFullScreen; [self performSegueWithIdentifier:@"CustomSegue" sender:self];
hightech

1
Chạy điều này trong iOS 6 và 7, trình điều khiển chế độ xem mới rõ ràng trong khi tạo hiệu ứng cho bản trình bày, nhưng một khi nó ở vị trí nền sẽ chuyển sang màu đen. Nó trở nên rõ ràng một lần nữa khi hoạt hình sa thải. Có ai khác có vấn đề này?
vẽ C

3
@pkamb Tôi đã cập nhật giải pháp cho iOS 7. stackoverflow.com/a/11252969/1344459 Tôi hy vọng điều đó sẽ giúp bạn.
cao

114

Vì vậy, đối với những người suy nghĩ trực quan thuần túy và người hâm mộ cốt truyện, bạn có thể làm:

1. Trình bày bộ điều khiển xem

Xác định bối cảnh

2. Trình điều khiển xem trình bày

Trình bày: Trong bối cảnh hiện tại


Đây phải là câu trả lời được chấp nhận. Đây là tất cả những gì bạn phải làm để làm việc này, sau đó đặt màu nền của chế độ xem trên bộ điều khiển phương thức để xóa.
Jesse

Đồng ý, các tùy chọn bảng phân cảnh ghi đè mã trong trường hợp này.
C0D3

17
Câu trả lời này thật ngọt ngào, bây giờ tôi bị tiểu đường.
GeneCode

25

Giải pháp Swift 3 & iOS10:

//create view controller
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "RoadTripPreviewViewController")
//remove black screen in background
vc.modalPresentationStyle = .overCurrentContext
//add clear color background
vc.view.backgroundColor = UIColor.clear
//present modal
self.present(vc, animated: true, completion: nil)

16

Đây là từ xCode 7 beta 4 bằng cách sử dụng segue kéo điều khiển. Chỉ cần đặt nền của điểm đến của bạn thành xóa và đặt các thuộc tính segue trong IB như thế này (nb. Bản trình bày cũng có thể là "Trên toàn màn hình"):

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


2
CẢM ƠN BẠN. tôi đã sửa lỗi segue của bạn + câu trả lời của ViewControllers bởi @pasevin và nó đã hoạt động !!
CSawy

1
Điều này đã trả lời câu hỏi của tôi. Cảm ơn rât nhiều. Có phiếu bầu lên: D
Nate4436271

8

Tôi đã tìm thấy cách dễ nhất để làm cho nó hoạt động trên iOS7 và iOS8 là thêm cài đặt bản trình bàyStyle thành UIModalPftimeationOverCienContext trên modallyPftimeedVC (ViewContoder mà bạn muốn trình bày theo phương thức) vì iOS8:

[modallyPresentedVC setModalPresentationStyle:UIModalPresentationOverCurrentContext];
[modallyPresentedVC.navigationController setModalPresentationStyle:UIModalPresentationOverCurrentContext];

và UIModalPftimeationCiverseContext về trình bàyVC (bộ điều khiển trình bày modallyPftimeed) vì iOS7:

[presentingVC setModalPresentationStyle:UIModalPresentationCurrentContext];
[presentingVC.navigationController setModalPresentationStyle:UIModalPresentationCurrentContext];

Bởi vì mọi thứ được xử lý khác nhau trên iOS7 và iOS8. Tất nhiên, bạn không phải đặt thuộc tính navigationContoder nếu bạn không sử dụng thuộc tính. Mong rằng sẽ giúp.


đã cứu thịt xông khói của tôi! Cảm ơn
Vịt

5

Phiên bản Swift2:

let vc = self.storyboard!.instantiateViewControllerWithIdentifier("YourViewController") as! YourViewController
vc.view.backgroundColor = UIColor.clearColor()
vc.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen // orOverCurrentContext to place under navigation
self.presentViewController(vc, animated: true, completion: nil)

4

Một cách khác (không cần tạo chuyển đổi tùy chỉnh và hoạt động trên iOS 7)

Sử dụng Storyboard:

Tạo Trình điều khiển Chế độ xem trẻ em với kích thước tự do, đặt chiều rộng chế độ xem thành 500x500 (ví dụ) và thêm phương thức tiếp theo:

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    self.view.superview.bounds = CGRectMake(0, 0, 500, 500);
    self.view.superview.backgroundColor = [UIColor clearColor];
}

Sau đó tạo một segue Modal với Form Sheet và kiểm tra nó.


Bạn thật tuyệt!!! Điều này thực sự hoạt động !!! .
Radu Simionescu

4

Giải pháp iOS 7 với segue tùy chỉnh:

CustomSegue.h
#import <UIKit/UIKit.h>

    @interface CustomSegue : UIStoryboardSegue <UIViewControllerTransitioningDelegate, UIViewControllerAnimatedTransitioning>

    @end



CustomSegue.m
#import "CustomSegue.h"

@implementation CustomSegue

-(void)perform {

    UIViewController* destViewController = (UIViewController*)[self destinationViewController];
    destViewController.view.backgroundColor = [UIColor clearColor];
    [destViewController setTransitioningDelegate:self];
    destViewController.modalPresentationStyle = UIModalPresentationCustom;
    [[self sourceViewController] presentViewController:[self destinationViewController] animated:YES completion:nil];
}


//===================================================================
// - UIViewControllerAnimatedTransitioning
//===================================================================

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

- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {

    UIView *inView = [transitionContext containerView];
    UIViewController* toVC = (UIViewController*)[transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromVC = (UIViewController *)[transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [inView addSubview:toVC.view];

    CGRect screenRect = [[UIScreen mainScreen] bounds];
    [toVC.view setFrame:CGRectMake(0, screenRect.size.height, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];

    [UIView animateWithDuration:0.25f
                     animations:^{

                         [toVC.view setFrame:CGRectMake(0, 0, fromVC.view.frame.size.width, fromVC.view.frame.size.height)];
                     }
                     completion:^(BOOL finished) {
                         [transitionContext completeTransition:YES];
                     }];
}


//===================================================================
// - UIViewControllerTransitioningDelegate
//===================================================================

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {

    return self;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
    //I will fix it later.
    //    AnimatedTransitioning *controller = [[AnimatedTransitioning alloc]init];
    //    controller.isPresenting = NO;
    //    return controller;
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

- (id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator {
    return nil;
}

@end

Giải pháp dựa trên mã hightech.


Khi tôi loại bỏ bởi [self notifyViewControllAnimated: CÓ hoàn thành: NULL]; Tôi có một ngoại lệ ??
Asadullah Ali

Có cho mã này. Hoặc bạn phải thực hiện phương thức animationControllForDismissedControll để hoạt hình bắt đầu hoạt động.
Max Gribov

4

Đối với tôi tác phẩm này:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"MMPushNotificationViewController"];

    vc.view.backgroundColor = [UIColor clearColor];
    self.modalPresentationStyle = UIModalPresentationCurrentContext;
#ifdef __IPHONE_8_0
    if(IS_OS_8_OR_LATER)
    {
        self.providesPresentationContextTransitionStyle = YES;
        self.definesPresentationContext = YES;
        [vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];
    }
#endif


    [self presentViewController:vc animated:NO completion:nil];

MMPushNotificationViewControllerlà bộ điều khiển Chế độ xem trong suốt và tôi cũng đã tạo MMPushNotificationViewControllermàu của chế độ xem là màu rõ ràng. Bây giờ Tất cả những gì tôi đã làm và thực hiện Trình điều khiển trong suốt của tôi.


2

Dành cho iOS7

Hiện tại có một cách để đạt được điều này bằng cách sử dụng các chuyển đổi tùy chỉnh iOS7, theo cách này:

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

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

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

Bạn có thể tìm thêm thông tin về chuyển tiếp tùy chỉnh trong hướng dẫn này .


Bất kỳ lý do cụ thể tại sao bạn đã thêm lớp điều khiển chính và lớp điều khiển xem thứ hai trong lớp hoạt hình? tại sao bạn không trực tiếp sử dụng UIViewControll * toVC = (UIViewControll *) [transContext viewControllForKey: UITransitionContextToViewControllKey]; UIViewControll * fromVC = (UIViewControll *) [transContext viewControllForKey: UITransitionContextFromViewControllKey];
Satyam Raikar

Đây không phải là hướng dẫn của tôi, vì vậy tôi không biết về vấn đề này. Quan điểm của bạn có vẻ hợp lệ mặc dù.
Kirualex

2

Hoạt động tuyệt vời trên iOS7iOS8

UIViewController* vc=[[UIViewController alloc]initWithNibName:@"VC" bundle:nil];

vc.view.alpha=0.7;
[vc setModalPresentationStyle:UIModalPresentationOverCurrentContext];

self.navigationController.modalPresentationStyle = UIModalPresentationCurrentContext;

[self presentViewController:vc animated:NO completion:nil];

Một bản sao của câu trả lời tốt thứ hai.
Tomasz Bąk

2

Bạn cũng có thể 'thêm lại' cửa sổ để xem.

OneViewController *vc = [[OneViewController alloc] init];
if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:vc animated:YES completion:nil];
} else {
    [self presentModalViewController:vc animated:YES];
}

[[[UIApplication sharedApplication] keyWindow] insertSubview:self.view atIndex:0];

Và theo cách này, trình bày có thể được hoạt hình.


1

Đối với iOS 7 và chỉ bằng cách sử dụng Trình tạo giao diện, có thể thực hiện được bằng cách đặt Bản trình bày thành "Bối cảnh hiện tại" trên tất cả các bộ điều khiển chế độ xem liên quan đến bản trình bày phương thức. Ngay cả đối với bộ điều khiển điều hướng.

Chẳng hạn, đặt nó trên tất cả các bộ điều khiển xem này:

NavContoder -> RootViewControll -> ModalViewCont điều khiển

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


0

Tôi đã không chơi xung quanh với trình xây dựng Storyboard / Interface, nhưng điều nổi bật ở tôi là bạn đang nói rằng chế độ xem được tô màu rõ ràng (ví dụ: 100% alpha / nhìn xuyên qua) và cũng nói nó bị mờ ( Alpha 0% - hoàn toàn rắn). Hai điều này dường như không lưới. Tôi muốn bình luậnself.view.opaque = YES; và xem nó có hoạt động không;)

À, một điều khác tôi vừa nghĩ đến - hoàn toàn có thể là bộ điều khiển xem của bạn KHÔNG có nền alpha, nhưng tất nhiên alpha sẽ được hiển thị thông qua màu của cửa sổ cơ sở hoặc bộ điều khiển xem gốc của chương trình, đó là bởi màu đen mặc định. Lớp cơ sở của toàn bộ ứng dụng của bạn không thể có nền trong suốt - trong suốt để làm gì? Điều gì đằng sau nó? Phải có một cái gì đó để thấy QUA sự minh bạch. Điều đó có ý nghĩa?


Tôi đã cố gắng bình luận về self.view.opaque = CÓ; dòng và nó không hoạt động. :-(
hightech

Bạn đã đọc phần thứ hai của câu trả lời của tôi? Bạn có thể không thể làm những gì bạn muốn, tùy thuộc vào thiết lập của bạn. Bạn đang đặt gì đằng sau ClearColor VC? Có lẽ chúng ta có thể sắp xếp thứ này ^^
WendiKidd

-3

Chỉ cần sử dụng "self.modalPftimeationStyle = UIModalPftimeationCiverseContext;", trong chế độ xem

Sẽ hoạt động tốt :)


1
Đây chỉ là lặp lại những gì các câu trả lời hiện có đã nói.
Pang
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.