Я делаю частичный оверлейный модальный код в своем приложении с кодом из «Полумодальных (прозрачных) диалогов на iPhone» на ramin.firoozye.com. При этом кнопка, которая вызывает модальную, все еще видна и доступна для клика. Я скрою эту кнопку, когда модальная нерестится, но я хочу быть уверенным, что если пользователь нажимает очень быстро дважды, новый модаль не появляется для каждого щелчка. Каков наилучший способ проверить, что модаль еще не существует, когда вы вызываете его нажатием кнопки?iPhone: создайте единый UIView из нескольких кликов
Вы можете download the test project here. Для тех, которые не имеют 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];
}
Любая помощь очень ценится!
Я полагаю, что мне придется поместить свои функции скрытия в том же классе, что и функции show, чтобы поддерживать это условное. Спасибо за добавленный отзыв о скрытии кнопки, но ошибки Sender.hidden, которые отправитель не объявлен. [sender setHidden: YES]; компилирует, но запускает нераспознанный селектор, отправленный в экземплярную ошибку. Есть идеи? – Cuzog
Из того, что я могу сказать, UIBarButtonItems нельзя скрыть. Они могут быть установлены только на ноль, а затем повторно инициализированы. Я намерен скрыть всю панель навигации, когда модальные дисплеи все равно, что, к счастью, имеет встроенный метод для обработки этого. – Cuzog
А ... Да, я помню, что всегда очень раздражало то, что компилятор не позволит вам использовать синтаксис свойств в типе id (даже если он действительно работает).Я знаю, что это не поможет сейчас, но на будущее, если вы определите метод следующим образом: - (IBAction) doWhatever: (UIBarButtonItem *) отправитель , тогда все будет хорошо. Я, хотя вы использовали UIButton, который, насколько мне известно, может быть скрыт. Надеюсь, вам это удастся! Другой метод (хотя у вас уже есть рабочий) может состоять в использовании шаблона делегирования и задайте представление, которое имеет панель в качестве делегата модального. –