deleted-mezhevikin
@deleted-mezhevikin

Проблема с PopoupViewController [видеовопрос]?

В MainViewController открываю PopupViewController с помощью метода presentViewController:animated:completion.
В PopupViewController добавляется popupView (красная на видео), а self.view делаю прозрачной.
Но по завершению анимации появления контроллера self.view становится белым, почему так происходит?
+ хотелось бы сделать закрытие (dismissViewControllerAnimated) по клику на self.view PopupViewController'а. Но если повесить UITapGestureRecognizer с закрытием на self.view, событие будет срабатывать по тапу как бекграунда так и popupView, а нужно чтоб срабатывал только бекграунд.

www.youtube.com/watch?v=sFUMs-RUtXE - видео
https://github.com/nullproduction/PopupViewController - полный код тестового проекта

p.s. не использую nib и сторибоард, предпологаю что может быть связанно с этим

//
//  MainViewController.m
//

#import "MainViewController.h"
#import "PopupViewController.h"

@implementation MainViewController

- (void)viewDidLoad
{
    self.view.backgroundColor = [UIColor grayColor];
    [self addPopupButton];
    [super viewDidLoad];
}

- (void)addPopupButton
{
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Show modal" style:UIBarButtonItemStyleBordered target:self action:@selector(showPopup)];
}

- (void)showPopup
{
    PopupViewController *popupViewController = [[PopupViewController alloc] init];
    [self presentViewController:popupViewController animated:YES completion:nil];
}

@end


//
//  PopupViewController.m
//

#import "PopupViewController.h"

@implementation PopupViewController

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

- (void)addPopupView
{
    popupView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 200, 200)];
    popupView.backgroundColor = [UIColor redColor];
    [self.view addSubview:popupView];
}

@end
  • Вопрос задан
  • 2689 просмотров
Пригласить эксперта
Ответы на вопрос 2
можно например подписаться делегатом на событие touchesEnded gestureRecognizer и проверить там if (![touch.view isDescendantOfView:popoverViewContainer]) { [self hidePopover]; }

белый фон это как мне кажется фон UIWindow, потому что подложный viewController как я помню не остается под тем, который был презентован
вообще это надо бы делать как UIWindow, алерты и попапы ввода сообщений шаринга в соцсети именно так и сделаны
Ответ написан
Flanker_4
@Flanker_4
насчет второго, Вы всегда можете запретить GestureRecognizer'у реагировать на тапы в некоторых view'ушках. Примеры в документации или тут
stackoverflow.com/questions/15814697/uitapgesturerecognizer-tap-on-self-view-but-ignore-subviews
Насчет первого, скорей всего проблема в
[self presentViewController:popupViewController animated:YES completion:nil];
Насколько я помню, с анимацией через presentViewController возникают проблемы , если вы хотите оставить под низом старый viewController. stackoverflow.com/questions/7256652/why-does-presentmodalviewcontrolleranimated-turn-the-background-black/ . Идея такова (а особенно на iPhone), что должен присутствовать только один активный viewController на сцене.
Конечно можно попробывать поиграть с modalTransitionStyle
и прочими property, отвечающими за стиль анимации, но как показывает практика, в новых версиях ios это может сломаться. Можно сделать свою кастомную анимацию добавления поповера через
[self.view addSubview:popupViewController.view]; и [UIView animationWithDuration]
Но я бы рекомендовал посмотреть в сторону стандартных элементов управления, к примеру ActionSheet
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы