iphone - viewdidlayoutsubviews - viewwilllayoutsubviews




通過UIViewController顯示clearColor UIViewController (11)

對於iOS7

現在有一種方法可以通過這種方式使用iOS7自定義轉換來實現這一點:

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

要創建您的自定義過渡,您需要2件事:

  • 一個TransitionDelegate對象(實現<UIViewControllerTransitionDelegate>
  • 一個“AnimatedTransitioning”對象(實現<UIViewControllerAnimatedTransitioning>

你可以在本tutorial找到更多關於自定義轉換的信息。

我有一個UIViewController視圖作為另一個UIViewController視圖的子視圖/模式,比如子視圖/模式應該是透明的,並且任何組件添加到子視圖都應該是可見的。 問題是,我已經是子視圖顯示黑色背景,而不是有clearColor。 我試圖使UIView作為clearColor而不是黑色背景。 有人知道它有什麼問題嗎? 任何建議表示讚賞。

FirstViewController.m

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

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

SecondViewController.m

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

解決 :我解決了這些問題。 它對iPhone和iPad都非常有用。 沒有黑色背景的模態視圖控制器只是clearColor /透明。 唯一需要改變的是我將UIModalPresentationFullScreen替換為UIModalPresentationCurrentContext 。 這很簡單!

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

注意:如果您使用navigationControllermodalPresentationStyle屬性:

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

注意:壞消息是上述解決方案在iOS 7上不起作用。好消息是我解決了iOS7的問題! 我問過別人的幫助,他說的是:

當以模態方式呈現視圖控制器時,iOS會在呈現視圖控制器的持續時間內從視圖層次結構中刪除其下的視圖控制器。 雖然你的模態化視圖控制器的視圖是透明的,但除了應用程序窗口(它是黑色的)之外沒有任何內容。 iOS 7引入了一種新的模式演示風格UIModalPresentationCustom ,它導致iOS不刪除所呈現視圖控制器下的視圖。 但是,為了使用這種模式演示風格,您必須提供您自己的轉換委託來處理演示文稿並解除動畫。 這在WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218中的'使用視圖控制器自定義轉換使用視圖控制器'的講座中進行了概述,其中還介紹瞭如何實現您自己的過渡代理。

你可能會看到我的解決方案在iOS7中的上述問題: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions : https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


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)

iOS8上+

在iOS8 +中,您現在可以使用新的modalPresentationStyle UIModalPresentationOverCurrentContext來呈現具有透明背景的視圖控制器:

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

解決 :我解決了這些問題。 它對iPhone和iPad都非常有用。 沒有黑色背景的模態視圖控制器只是clearColor /透明。 唯一需要改變的是我將UIModalPresentationFullScreen替換為UIModalPresentationCurrentContext。 這很簡單!

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

注意:如果您使用navigationController的modalPresentationStyle屬性:

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

注意:壞消息是上述解決方案在iOS 7上不起作用。好消息是我解決了iOS7的問題! 我問過別人的幫助,他說的是:

當以模態方式呈現視圖控制器時,iOS會在呈現視圖控制器的持續時間內從視圖層次結構中刪除其下的視圖控制器。 雖然你的模態化視圖控制器的視圖是透明的,但除了應用程序窗口(它是黑色的)之外沒有任何內容。 iOS 7引入了一種新的模式演示風格UIModalPresentationCustom,它導致iOS不刪除所呈現視圖控制器下的視圖。 但是,為了使用這種模式演示風格,您必須提供您自己的轉換委託來處理演示文稿並解除動畫。 這在WWDC 2013 https://developer.apple.com/wwdc/videos/?id=218中的'使用視圖控制器自定義轉換使用視圖控制器'的講座中進行了概述,其中還介紹瞭如何實現您自己的過渡代理。

你可能會看到我的解決方案在iOS7中的上述問題: https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions : https://github.com/hightech/iOS-7-Custom-ModalViewController-Transitions


另一種方式(無需創建自定義轉換並在iOS 7上運行)

使用故事板:

創建具有自由大小的子視圖控制器,將視圖寬度設置為500x500(例如)並添加下一個方法:

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

然後用Form Sheet創建一個Modal segue並測試它。


只需使用“self.modalPresentationStyle = UIModalPresentationCurrentContext;”,在呈現視圖

將工作正常:)


對於iOS 7,只有使用Interface Builder,可以通過在模態演示中涉及的所有視圖控制器上將演示文稿設置為“Over Current Context”來完成。 即使對於導航控制器。

例如,在所有這些視圖控制器上設置它:

NavController - > RootViewController - > ModalViewController


您還可以將窗口重新添加到視圖中。

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

通過這種方式,可以呈現動畫。


我還沒有玩過Storyboard / Interface構建器,但是對我來說,彈出的是你要讓視圖變得清晰(即100%透明/透明)並告訴它不透明( 0%α - 完全固體)。 這兩件事似乎並沒有網格化。 我會註釋掉self.view.opaque = YES; 行,看看它是否工作,然後;)

啊,我剛才想到的其他東西 - 它完全有可能是你的視圖控制器有alpha背景,但是當然alpha會顯示到程序的基本窗口或根視圖控制器的顏色,這是通過默認黑色。 整個應用程序的基礎層不能具有透明背景 - 對於什麼透明? 它背後是什麼? 必須透過透明度才能看到一些東西。 那有意義嗎?


所以對於純粹的視覺思想家和故事板迷來說,你可以這樣做:

1.呈現視圖控制器

提出視圖控制器


這是從xCode 7 beta 4使用一個控件拖動segue。 簡單地設置您的目的地的背景以清除,並在IB中設置segue屬性(nb。演示文稿也可以是“全屏幕”):







storyboard