Как представить полупрозрачный (полупрозрачный) viewcontroller в iOS?

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

Как я могу исправить это и сделать его пребывание как clearColor?

UIViewController *menuViewController=[[UIViewController alloc]init];
   menuViewController.view.backgroundColor=[UIColor clearColor];
   menuViewController.view.tintColor=[UIColor clearColor];
   menuViewController.view.opaque=NO;

UIView *menuView=[[UIView alloc]initWithFrame:CGRectMake(0,[UIScreen mainScreen].bounds.size.height-200,320,200)];
   menuView.backgroundColor=[UIColor redColor];

[menuViewController.view addSubview:menuView];

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

обновление: Я пытаюсь увидеть содержимое "self" (представление presenter viewcontroller).

5 ответов


обновление

в большинстве случаев вы захотите следовать рекомендациям из Рик ниже. Как он упоминает, menuViewController.modalPresentationStyle = .overCurrentContext самый простой современный способ сохранить контроллер представления видимым.

Я сохраняю этот ответ, потому что он предоставил самое прямое решение проблемы OPs, где они уже имели представление, управляемое текущим контроллером представления, и просто искали способ представить его, и потому что он объясняет фактическую причину проблемы.


как упоминалось в комментариях, это не проблема прозрачности (в противном случае вы ожидаете, что фон станет белым). Когда presentViewController:animated:completion: анимация завершена, контроллер представления представления фактически удален из визуального стека. Черный вы видите, это цвет фона окна.

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


вы можете представить контроллер вида и по-прежнему иметь исходный контроллер вида, видимый под ним, как форма, в iOS 7. Для этого вам нужно будет сделать две вещи:--9-->

  1. установите модальный стиль презентации на пользовательский:

    viewControllerToPresent.modalPresentationStyle = UIModalPresentationCustom;
    
  2. установите делегат перехода:

    viewControllerToPresent.transitioningDelegate = self;
    

в этом случае мы установили делегат в self, но это может быть другой объект. Делегату необходимо реализовать два обязательные методы протокола, возможно так:

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    SemiModalAnimatedTransition *semiModalAnimatedTransition = [[SemiModalAnimatedTransition alloc] init];
    semiModalAnimatedTransition.presenting = YES;
    return semiModalAnimatedTransition;
}

- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    SemiModalAnimatedTransition *semiModalAnimatedTransition = [[SemiModalAnimatedTransition alloc] init];
    return semiModalAnimatedTransition;
}

в этот момент Вы можете думать, где это SemiModalAnimatedTransition класс пришел. Ну, это пользовательская реализация, принятая из таблице+лакса's блоге.

вот заголовок класса:

@interface SemiModalAnimatedTransition : NSObject <UIViewControllerAnimatedTransitioning>
@property (nonatomic, assign) BOOL presenting;
@end

и реализации:

#import "SemiModalAnimatedTransition.h"

@implementation SemiModalAnimatedTransition

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return self.presenting ? 0.6 : 0.3;
}

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

    CGRect endFrame = fromViewController.view.bounds;

    if (self.presenting) {
        fromViewController.view.userInteractionEnabled = NO;

        [transitionContext.containerView addSubview:fromViewController.view];
        [transitionContext.containerView addSubview:toViewController.view];

        CGRect startFrame = endFrame;
        startFrame.origin.y = endFrame.size.height;

        toViewController.view.frame = startFrame;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
            toViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
    else {
        toViewController.view.userInteractionEnabled = YES;

        [transitionContext.containerView addSubview:toViewController.view];
        [transitionContext.containerView addSubview:fromViewController.view];

        endFrame.origin.y = endFrame.size.height;

        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            toViewController.view.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
            fromViewController.view.frame = endFrame;
        } completion:^(BOOL finished) {
            [transitionContext completeTransition:YES];
        }];
    }
}

@end

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

обновление:

для iOS 8 пейзаж снова изменился. Все, что вам нужно сделать, это использовать новый стиль презентации .OverCurrentContext, например:

viewControllerToPresent.modalPresentationStyle = UIModalPresentationOverCurrentContext;

это довольно простая задача для решения. Вместо создания пользовательского перехода представления вам просто нужно установить modalPresentationStyle для представленного контроллера представления. Кроме того, вы должны установить цвет фона (и Альфа-значение) для контроллера представления, представленного в раскадровке / через код.

CustomViewController: UIViewController {
    override func viewDidLoad() {
      super.viewDidLoad()
      view.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.6)
    }
}

в компоненте IBAction представления контроллера вида -

let vc = storyboard?.instantiateViewControllerWithIdentifier("customViewController") as! CustomViewController
vc.modalPresentationStyle = UIModalPresentationStyle.Custom
presentViewController(vc, animated: true, completion: nil)

вы должны использовать свойство modalPresentationStyle скачать начиная с iOS 3.2.

например:

presenterViewController.modalPresentationStyle = UIModalPresentationCurrentContext;
[presenterViewController presentViewController:loginViewController animated:YES completion:NULL];

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