Есть ли простой способ создать всплывающее окно такого типа (например, с UIPopoverController) или мне нужно создать его с нуля?
POP-UP UIView Стиль приложения IMDB
Ответы (1)
Вы можете сделать что-то подобное с нуля довольно легко. Хитрость заключается в том, чтобы сделать ваш контроллер всплывающего окна прозрачным слоем на весь экран.
С вашего основного вида:
self.popoverController = [[PopoverController alloc]
initWithNibName:@"PopoverViewController" bundle:nil];
self.popoverController.view.frame =
CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[self.view addSubview:self.popoverController.view]; // view is the transparent background
[self.popoverController viewWillAppear:NO];
Теперь это просто вопрос реализации viewWillAppear, если вам нужны эффекты перехода:
- (void) viewWillAppear:(BOOL)animated {
self.fadeView.alpha = 1.0f;
self.view.alpha = 0.0;
[self slideIn];
}
// Slide in with whatever effects you want your popup to use
- (void) slideIn {
//set initial location at bottom of view (my popup slid in from the bottom)
CGRect frame = self.configView.frame;
frame.origin = CGPointMake(0.0, self.view.bounds.size.height);
self.configView.frame = frame;
[self.view addSubview:self.configView];
//animate to new location, determined by height of the view in the NIB
[UIView beginAnimations:@"presentWithSuperview" context:nil];
[UIView setAnimationDuration:0.5];
self.view.alpha = 1.0; // fade in background
frame.origin = CGPointMake(0.0, self.view.bounds.size.height -self.configView.bounds.size.height);
self.configView.frame = frame; // animate in popup
[UIView commitAnimations];
}
- (void) slideOut {
[UIView beginAnimations:@"removeFromSuperviewWithAnimation" context:nil];
[UIView setAnimationDuration:0.5];
self.view.alpha = 0.0;
// Set delegate and selector to remove from superview when animation completes
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
// Move this view to bottom of superview (my popup slides back to the bottom when finished)
CGRect frame = self.configView.frame;
frame.origin = CGPointMake(0.0, self.view.bounds.size.height);
self.configView.frame = frame;
[UIView commitAnimations];
}
// Finally remove the views when you're done animating out.
- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
if ([animationID isEqualToString:@"removeFromSuperviewWithAnimation"]) {
[self.configView removeFromSuperview];
[self.view removeFromSuperview];
}
}
За бонусные баллы вы можете сделать прозрачный фон элементом управления и заставить его определять касания, когда всплывающее окно должно исчезнуть. Я использовал построитель интерфейса для вызова действия, которое вызывает slideOut.
person
Winder
schedule
24.02.2011
Хороший! Поскольку мы строим его с нуля, насколько сложно анимировать вид с помощью этого 3D-флипа, который есть на IMDB? Я никогда не занимался 3D анимацией, даже не знаю с чего начать. Спасибо Уиндер.
- person Roberto; 25.02.2011
CATransform3DMakeRotation был ответом. :-)
- person Roberto; 28.02.2011
Может ли кто-нибудь объяснить этот код немного подробнее, пожалуйста? Весьма признателен. Благодарность!
- person Sohan; 20.06.2011
Первый блок кода будет в вашем существующем приложении, запускаемом чем-то вроде нажатия кнопки. Это просто загрузка контроллера представления из NIB и его отображение. Второй блок кода находится внутри реализации контроллера представления, здесь есть две хитрости. Во-первых, у вас есть два вида, один из которых полупрозрачный, а другой находится за пределами экрана. Теперь, когда viewWillAppear вызывается автоматически, ему просто нужно анимировать всплывающее окно. Наконец, когда вы закончите с ним, вызовите метод slideOut, чтобы анимировать его.
- person Winder; 21.06.2011
Понятно. Теперь это кажется легким :-) Спасибо @Winder!
- person Sohan; 21.06.2011