Как использовать presentModalViewController для создания прозрачного представления

Я показываю модальный вид с

[self presentModalViewController:controller animated:YES]; 

Когда представление перемещается вверх по экрану, оно прозрачно в соответствии с настройкой в ​​файле xib, из которого он создан, но как только он заполняет экран, он становится непрозрачным.

Есть ли способ сохранить прозрачность?

Я подозреваю, что вид, который он размещает, не отображается, а не то, что модальное представление становится непрозрачным.

Ваше представление все еще прозрачно, но как только ваш модальный controller находится в верхней части стека, вид за ним скрыт (как в случае с любым controllerом самого большого вида). Решение состоит в том, чтобы вручную анимировать представление самостоятельно; то скрытый контроль ControlController не будет скрыт (так как у вас его не останется).

После iOS 3.2 существует способ сделать это без каких-либо «трюков» – см. Документацию для свойства modalPresentationStyle . У вас есть rootViewController, который будет представлять viewController. Итак, вот код успеха:

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

С помощью этого метода фон viewController будет прозрачным, и основной rootViewController будет виден. Обратите внимание, что это похоже, похоже, работает на iPad, см. Комментарии ниже.

Что мне нужно, чтобы заставить это работать:

 self.window.rootViewController.modalPresentationStyle = UIModalPresentationCurrentContext; 

Для тех, кто хочет увидеть какой-то код, вот что я добавил к controllerу прозрачного представления:

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

Утвержденный Apple способ сделать это в iOS 8 – установить modalPresentationStyle в «UIModalPresentationOverCurrentContext».

Из документации UIViewController:

UIModalPresentationOverCurrentContext

Стиль презентации, в котором контент отображается только над содержимым controllerа родительского представления. Представления, находящиеся под представленным контентом, не удаляются из иерархии представлений, когда заканчивается презентация. Поэтому, если представленный диспетчер представлений не заполняет экран непрозрачным контентом, основное содержание просматривается.

При представлении controllerа представления в popover этот стиль презентации поддерживается только в том случае, если стиль перехода – UIModalTransitionStyleCoverVertical. Исключение составляет попытка использовать другой стиль перехода. Тем не менее, вы можете использовать другие стили перехода (за исключением частичного перехода curl), если controller родительского представления не находится в popover.

Доступно в iOS 8.0 и более поздних версиях.

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

«Просмотр controllerов в iOS 8» от WWDC 2014 подробно рассматривается в этом.

Обязательно дайте представленному controllerу представления четкий цвет фона (в противном случае он по-прежнему будет непрозрачным).

Существует еще один вариант: перед показом модального controllerа сделайте снимок экрана всего windows. Вставьте захваченное изображение в UIImageView и добавьте представление изображения в представление controllerа, которое вы собираетесь показать. Затем отправьте обратно. Вставьте еще один вид над изображением (черный фон, alpha 0.7). Покажите свой модальный controller, и похоже, что он был прозрачным. Просто попробовал на iPhone 4 с iOS 4.3.1. Как очарование.

это довольно старо, но я решил ту же проблему: так как мне нужно представить controller навигации в iPhone, добавление subview не было жизнеспособным решением.

Итак, что я сделал:

1) Перед представлением controllerа просмотра сделайте снимок экрана текущего экрана:

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

2) Создайте controller представления, который вы хотите представить, и добавьте фон в качестве подзапроса, отправив его обратно.

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

3) Представьте свой controller просмотра, но перед этим в новом controllerе представления добавьте прозрачный вид в viewDidLoad (я использовал ILTranslucentView)

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

И это все!

В IOS 8 это ломается, я использую controller навигации, и контекст, который отображается, представляет собой контекст меню навигации, который в нашем случае является скользящим controllerом меню.

Мы используем pod ‘TWTSideMenuViewController’, ‘0.3’, которые не проверялись, чтобы проверить, не является ли это проблемой в библиотеке или описанным выше способом.

Это со мной работало в iOS 8-9:

1- Установите фон вашего controllerа просмотра на альфа

2- добавьте этот код:

 TranslucentViewController *tvc = [[TranslucentViewController alloc] init]; self.providesPresentationContextTransitionStyle = YES; self.definesPresentationContext = YES; [tvc setModalPresentationStyle:UIModalPresentationOverCurrentContext]; [self.navigationController presentViewController:tvc animated:YES completion:nil]; 

Я записал свои выводы об этом в другом вопросе , но суть в том, что вам нужно вызвать modalPresentationStyle = UIModalPresentationCurrentContext на все, что принадлежит всему экрану на данный момент. В большинстве случаев это то, что является rootViewController [UIApplication sharedApplication] .delegate.window. Это также может быть новый UIViewController, который был представлен modalPresentationStyle = UIModalPresentationFullScreen .

Пожалуйста, прочитайте мой другой гораздо более подробный пост, если вам интересно, как я конкретно решил эту проблему. Удачи!

Я знаю, что это довольно старый вопрос. Я застрял в этом вопросе, и я смог добиться успеха в этой теме. Так что поставил здесь, как я это сработал :). Я использую раскадровку, и я перехожу к ViewController, который должен быть представлен. Контроллер вида имеет прозрачный цвет фона. Теперь в инспекторе атрибутов segue я установил презентацию в «Over current context». И это сработало для меня. Я разрабатываю для iPhone.

Атрибуты Инспектор сеге

Я создал открытую библиотеку soruce MZFormSheetController для представления листа модальной формы на дополнительном интерфейсе UIWindow. Вы можете использовать его для представления прозрачного модального controllerа, даже отрегулируйте размер представленного controllerа представления.

В моем состоянии у меня есть вид на том же viewController. Поэтому создайте новый controller представления для хранения UIView. Сделайте этот вид прозрачным, установив его альфа-свойство. Затем на кнопку щелкнуть я написал этот код. Выглядит хорошо.

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

И это показывает, чего я хочу. надеюсь, что это поможет кому-то.

Вот категория, которую я создал, которая решит проблему.

  // // UIViewController+Alerts.h // #import  @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 

Альтернативный способ – использовать «вид контейнера». Просто сделайте альфа ниже 1 и вставьте с помощью seque. XCode 5, целевой iOS7.

не может показать изображение, недостаточно репутации)))

Вид контейнера доступен с iOS6.

Этот код отлично работает на iPhone под iOS6 и iOS7:

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

Но таким образом вы теряете анимацию «слайд-снизу».

Я нашел это элегантное и простое решение для iOS 7 и выше!

Для iOS 8 Apple добавила UIModalPresentationOverCurrentContext, но она не работает для iOS 7 и ранее, поэтому я не мог использовать ее для своего случая.

Пожалуйста, создайте категорию и поместите следующий код.

файл .h

 typedef void(^DismissBlock)(void); @interface UIViewController (Ext) - (DismissBlock)presentController:(UIViewController *)controller withBackgroundColor:(UIColor *)color andAlpha:(CGFloat)alpha presentCompletion:(void(^)(void))presentCompletion; @end 

.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 

Примечание: он также работает для navigationContoller, tabBarController.

Пример использования:

  // 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(); }; 

Наслаждайся этим! и, пожалуйста, оставьте некоторые отзывы.

После того, как много исследований будет выглядеть так, это решит нашу проблему и послужит нашей цели.

создать сегмент от источника VC до целевого VC с идентификатором.

например, «goToDestinationViewController», чтобы облегчить жизнь, давайте рассмотрим текущий controller представления, т. е. тот, который вы хотите за своим прозрачным представлением в качестве источника и получателя в качестве адресата

Теперь в исходном VC в viewDidLoad: или в представлении

 performSegueWithIdentifier("goToDestinationViewController", sender: nil) 

хорошо, мы на полпути. Теперь иди в свою раскадровку. Нажмите на сегмент. который должен выглядеть так: segue

измените параметры на показанные.

Теперь приходит реальное решение.

в представлении диспетчера просмотра viewDidLoad добавьте этот код.

 self.modalPresentationStyle = .Custom 

………………………………………….. …………………..ЭТО ПРОСТО……………………. …………………………………..

Это лучший и самый чистый способ, который я нашел до сих пор:

 @protocol EditLoginDelegate  - (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]; } 

Лучшим решением, с которым я столкнулся, является использование метода addChildViewController. Вот отличный пример: добавьте представление controllerа дочернего представления в подзаголовок родительского controllerа представления

Я пытаюсь использовать несколько методов для решения, но все еще не удалось, следующий код реализован в конце.

Разрешение Свифта:

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

затем в controllerе вида B:

 // B.swift let a = A() self.present(a, animated: true, completion: nil) 
  • Поведение видеоввода HTML5 на iPhone и iPod в веб-приложениях Safari
  • Установка высоты строки в UITextView
  • Получение NSDecimalNumber из определенной в локали строки?
  • как получить сообщение при получении уведомления «kCTMessageReceivedNotification» на IOS5
  • составные цвета: режим CALayer и blend на iPhone
  • Предотвратите запуск iTunes, когда iPhone подключен к Mac
  • Шаги по загрузке приложения iPhone в AppStore
  • Возможно ли в принципе для Android-устройства взаимодействовать с iPhone через Bluetooth / GameKit?
  • Обнаружение Retina Display
  • Размер шрифта, отображающий несоответствия на iPhone
  • Отправить изображение на сервер в виде двоичных данных
  • Interesting Posts

    Программно изменить уровень журнала в Log4j2

    передавая несколько аргументов FUN of lapply (и другие * применяются)

    Как эффективно распределять большие файлы

    Как получить классическое меню «Пуск» в Windows 7?

    Вычисление области многоугольника с использованием Локатора и долготы, сгенерированных из декартового пространства и файла мира

    Как заставить Google Chrome отображать HTTP-ответ в обычном тексте, а не загружать его в файл?

    Не удалось загрузить файл или сборку «Antlr3.Runtime (1)» или одну из его зависимостей

    Как установить iframe src в Angular 2 без исключения `unsafe value`?

    Создать OpenSSL с RPATH?

    Распределение памяти / освобождение Узкое место?

    Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson

    Глядя на экран в Windows 8 болит глаза

    Может ли Unity быть сделано, чтобы не вызывать синхронное исключение Exception все время?

    Возможно ли в Matlab явно форматировать выходные номера?

    Нет ActionBar в PreferenceActivity после обновления до поддержки библиотеки v21

    Давайте будем гением компьютера.