iphone - Отобразить clearColor UIViewController над UIViewController




objective-c ios (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 как subview / modal поверх другого представления UIViewController , например, что subview / modal должен быть прозрачным, а любые компоненты, добавленные в subview, должны быть видимыми. Проблема в том, что у меня есть subview, на черном фоне вместо clearColor. Я пытаюсь сделать UIView как UIView а не черным фоном. Кто-нибудь знает, что с ним не так? Любое предложение оценили.

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. Modal View Controller без черного фона просто clearColor / transparent. Единственное, что мне нужно изменить, - это заменить 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];

ВНИМАНИЕ. Если вы используете свойство modalPresentationStyle для navigationController :

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


Версия 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)

Для iOS 7 и только с помощью Interface Builder его можно выполнить, установив презентацию в «Over Current Context» на всех контроллерах представлений, участвующих в модальной презентации. Даже для навигационных контроллеров.

Например, установите его на всех этих контроллерах представления:

NavController -> RootViewController -> ModalViewController


Для меня это работает:

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

MMPushNotificationViewController - это контроллер прозрачного представления, а также я сделал цвет представления MMPushNotificationViewController как clearcolor. Теперь все, что я сделал, и сделал мой Transparentviewcontroller.


Поэтому для чисто визуальных мыслителей и поклонников раскадровки вы можете:

1. Представление контроллера просмотра

2. Представленный контроллер просмотра


Просто используйте «self.modalPresentationStyle = UIModalPresentationCurrentContext;», при представлении представления

Будет хорошо работать :)


Решение iOS 7 с пользовательским segue:

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

Решение основано на коде hightech.


Это от xCode 7 beta 4 с использованием контрольного перетаскивания. Просто установите фон вашего адресата для очистки и установите свойства segue в IB как это (nb. Presentation также может быть «Over Full Screen»):


Я не очень много играл с дизайнером Storyboard / Interface, но то, что появляется у меня, - это то, что вы говорите, что представление четкое (то есть 100% альфа / прозрачный), а также говорит, что оно непрозрачно ( 0% альфа - полностью твердый). Эти две вещи, похоже, не мешают. Я бы прокомментировал self.view.opaque = YES; line и посмотреть, работает ли он тогда;)

Ах, что-то еще, о чем я только подумал, - вполне возможно, что ваш контроллер просмотра имеет альфа-фон, но, конечно, альфа будет показывать цвет базового окна или контроллера корневого представления программы, что черный по умолчанию. На самом базовом уровне всего вашего приложения не может быть прозрачного фона - прозрачного для чего? Что стоит за этим? Должно быть что-то увидеть ЧЕРЕЗ прозрачность. Имеет ли это смысл?


iOS8 +

В iOS8 + теперь вы можете использовать новый modalPresentationStyle UIModalPresentationOverCurrentContext, чтобы представить контроллер вида с прозрачным фоном:

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

Работает отлично на iOS7 и iOS8

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




storyboard