iPhone: создать один UIView из нескольких кликов - PullRequest
0 голосов
/ 04 июня 2010

Я делаю модальное частичное наложение в моем приложении с помощью кода из «Полумодальных (прозрачных) диалогов на iPhone» на ramin.firoozye.com. При этом кнопка, вызывающая модальный режим, все еще видна и активна. Я буду скрывать эту кнопку, когда модал появляется, но я хочу быть уверен, что если пользователь дважды щелкает очень быстро, новый модал не появляется при каждом щелчке. Как лучше всего проверить, что модал еще не существует при вызове с помощью нажатия кнопки?

Вы можете скачать тестовый проект здесь . Для тех, у кого нет xcode, соответствующие функции ниже:

Я вызываю модальное нажатие кнопки следующим образом:

- (IBAction)displayModal:(id)sender {
    ModalViewController *modalController = [[ModalViewController alloc] initWithNibName:@"ModalViewController" bundle:nil];
    modalController.view.frame = CGRectOffset(modalController.view.frame, 0, 230);
    [self showModal:modalController.view];
}

Затем используйте эту функцию, чтобы анимировать пользовательский мод поверх текущего вида:

- (void)showModal:(UIView*) modalView {
    UIWindow* mainWindow = (((TestAppDelegate*) [UIApplication sharedApplication].delegate).window);

    CGPoint middleCenter = modalView.center;
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
    modalView.center = offScreenCenter; // we start off-screen
    [mainWindow addSubview:modalView];

    // Show it with a transition effect
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.4]; // animation duration in seconds
    modalView.center = middleCenter;
    [UIView commitAnimations];
}

Затем я отклоняю модальное нажатие кнопки следующим образом:

- (IBAction)dismissModal:(id)sender {
    [self hideModal:self.view];
}

И затем используйте эти функции, чтобы оживить модальный экран и очистить себя:

- (void)hideModal:(UIView*) modalView {
    CGSize offSize = [UIScreen mainScreen].bounds.size;
    CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
    [UIView beginAnimations:nil context:modalView];
    [UIView setAnimationDuration:0.7];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)];
    modalView.center = offScreenCenter;
    [UIView commitAnimations];
}

- (void)hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    UIView* modalView = (UIView *)context;
    [modalView removeFromSuperview];
    [self release];
}

Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 06 июня 2010

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

Я положил это в свой навигационный контроллер, где я называю модальный:

- (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notShowingModal) name:@"ModalDidClose" object:nil];
    [super viewDidLoad];
}

- (void)notShowingModal {
    isShowingModal = NO;
}

Затем я помещаю это в модальный контроллер, где модал отклонен:

- (void)viewDidDisappear:(BOOL)animated {
    [[NSNotificationCenter defaultCenter] postNotificationName:@"ModalDidClose" object:nil];
}

Возможно, я мог бы сделать это и с AppDelegate. Если кто-то думает, что это или что-то еще подойдет для этого, дайте мне знать.

0 голосов
/ 05 июня 2010

Если я понимаю ваш вопрос, вы можете просто сделать: Sender.hidden = ДА; Как первая строка в IBAction

Иначе, вы можете добавить BOOL ivar в заголовок, как это:

{
    BOOL isShowingModal;
}

И вставьте оператор if в displayModal и установите isShowingModal в YES

И в hideModal установите его на NO

...