Как перевернуть отдельный UIView (без отображения родительского представления)
Это проект iPad, в котором у меня есть UIView с несколькими subViews, и я пытаюсь оживить один из этих UIViews, используя [UIView transitionFromView: toView: duration: options: completion], но когда я запускаю этот метод, весь родитель просмотр перевернулся!
Это код, который я использую:
UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)];
[newView setBackgroundColor:[UIColor redColor]];
[UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil];
Любая идея о том, как я могу переключаться между этими представлениями без анимации всего родительского представления?
Спасибо!
Ответы
Ответ 1
этот код может помочь вам:
поместите два вида, которые вы хотите перевернуть внутри неназванного вида с одинаковым размером
и привяжите IBOutlet UIView *newView,*oldView;
к представлениям и поместите новый вид сверху
bool a = NO;
@implementation ViewController
- (IBAction)flip:(id)sender
{
if (a == NO) {
[UIView transitionFromView:oldView toView:newView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:NULL];
a = YES; // a = !a;
}
else {
[UIView transitionFromView:newView toView:oldView
duration:1.0
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:NULL];
a = NO; // a = !a;
}
}
Ответ 2
У меня были проблемы с тем, чтобы это работало. Я использовал код, написанный Флорисом, но, хотя он работал для первого "флип", следующий флип начал странно выглядеть, когда кнопки и метки на лицевом UI View потеряли свои позиции.
Я поставил код на место, и он работает нормально.
Несколько замечаний:
- panelView - это элемент управления UIView на ViewController, в котором есть два других UIViews внутри него (subviews). Первый называется frontView, второй - backView. (см. рисунок ниже).
![image of the view and subviews in IB]()
- У меня есть свойство bool, называемое displayFront в классе
(в моем .h)
@property BOOL displayingFront;
в моем .m
@synthesize displayingFront;
в моем методе viewDidLoad
self.displayingFront = YES;
Это код в .m, который я привязал к двум кнопкам, если передними и задними UIViews...
- (IBAction)flip:(id)sender
{
[UIView transitionWithView:self.panelView
duration:1.0
options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight :
UIViewAnimationOptionTransitionFlipFromLeft)
animations: ^{
if(displayingFront)
{
self.frontView.hidden = true;
self.backView.hidden = false;
}
else
{
self.frontView.hidden = false;
self.backView.hidden = true;
}
}
completion:^(BOOL finished) {
if (finished) {
displayingFront = !displayingFront;
}
}];
}
Ответ 3
Используйте представление контейнера для хранения ваших подзонов и сделайте контейнер вид того же размера, что и ваш подзаголовок, который вы пытаетесь оживить.
Итак, вы можете настроить свои представления следующим образом.
self.view- > "вид контейнера" → subviews
Ответ 4
**//flipping view continuously**
bool a = NO;
-(void)viewDidLoad
{
// THIS is the canvass holding the two views this view is flipping
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)];
v.backgroundColor=[UIColor clearColor];
[self.view addSubview:v];
[v addSubview:yourfirstview];
[v addSubview:yoursecondview];
// calling the method
[NSTimer scheduledTimerWithTimeInterval:2.0
target:self
selector:@selector(flip)
userInfo:nil
repeats:YES];
}
//flipping view randomly
-(void)flip
{
if (a == NO)
{
[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
a = YES;
}
else if(a==YES)
{
[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL];
a = NO;
}
}
Ответ 5
Я исправил эту проблему, используя анимацию старой школы:
[UIView beginAnimations:@"Flip" context:nil];
[UIView setAnimationDuration:1];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES];
[self addSubview:secondView];
[UIView commitAnimations];
Кроме того, вы можете удалить firstView:
[firstView removeFromSuperview];