Как представить полупрозрачный (полупрозрачный) 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-->
-
установите модальный стиль презентации на пользовательский:
viewControllerToPresent.modalPresentationStyle = UIModalPresentationCustom;
-
установите делегат перехода:
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 или любой уровень непрозрачности, который вам нравится.