gpt4 book ai didi

ios - 多个翻转动画不起作用

转载 作者:行者123 更新时间:2023-11-29 13:26:24 25 4
gpt4 key购买 nike

我遇到了一些奇怪的问题。我正在尝试创建一个无限翻转的 UIView 网格。为此,我创建了以下类:

@implementation LMFlipViewController

@synthesize viewOne=_viewOne, viewTwo=_viewTwo, animationDuration=_animationDuration, pause=_pause, animationFlag=_animationFlag;

-(LMFlipViewController *)initWithViewOne:(UIView *)viewOne viewTwo:(UIView *)viewTwo animationDuration:(CGFloat)animationDuration andPauseInBetweenAnimation:(CGFloat)pause {
[super init];
[self.view setFrame:viewOne.bounds];
_viewOne=viewOne;
_viewTwo=viewTwo;
_animationDuration=animationDuration;
_pause=pause;
return self;
}

-(void)viewDidLoad{
[super viewDidLoad];
NSLog(@"0");
_animationFlag=NO;
}

-(void)viewDidUnload{
[super viewDidUnload];
}

-(void)viewWillAppear:(BOOL)animated {
[self.view addSubview:_viewOne];
// [self performSelector:@selector(loopAnimation) withObject:nil afterDelay:_pause];
[NSTimer scheduledTimerWithTimeInterval:_pause
target:self
selector:@selector(loopAnimation)
userInfo:nil
repeats:NO];
NSLog(@"1");
}

-(void)triggerAnimation {
NSLog(@"5");
if (_animationFlag) {
NSLog(@"Animation flag: YES");
_animationFlag=NO;
[UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
[_viewTwo removeFromSuperview];
} completion:^(BOOL finished) {
[UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
[self.view addSubview:_viewOne];
} completion:nil];
}];
}else{
NSLog(@"Animation flag: NO");
_animationFlag=YES;
[UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
[_viewOne removeFromSuperview];
} completion:^(BOOL finished) {
[UIView transitionWithView:self.view duration:_animationDuration options:(UIViewAnimationOptionTransitionFlipFromLeft) animations: ^{
[self.view addSubview:_viewTwo];
} completion:nil];
}];
}
NSLog(@"6");
}

-(void)loopAnimation {
NSLog(@"2");
[self triggerAnimation];
NSLog(@"3");
// [self performSelector:@selector(loopAnimation) withObject:nil afterDelay:_pause];
[NSTimer scheduledTimerWithTimeInterval:_pause
target:self
selector:@selector(loopAnimation)
userInfo:nil
repeats:NO];
NSLog(@"4");
}

@end

然后,我试过这样的类(class):

- (void)viewDidLoad {
[super viewDidLoad];
UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewOne.backgroundColor=[UIColor redColor];

UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewTwo.backgroundColor=[UIColor purpleColor];

LMFlipViewController *flipViewController=[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3];
[self.view addSubview:flipViewController.view];

UIView *viewThree=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewThree.backgroundColor=[UIColor blackColor];

UIView *viewFour=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewFour.backgroundColor=[UIColor blueColor];

LMFlipViewController *flipViewControllerTwo=[[LMFlipViewController alloc] initWithViewOne:viewThree viewTwo:viewFour animationDuration:0.5 andPauseInBetweenAnimation:3];
[flipViewControllerTwo.view setFrame:CGRectMake(0, 60, 100, 50)];
[self.view addSubview:flipViewControllerTwo.view];
}

这种方式非常有效。关键是,我需要以这种方式实例化多个翻转 View ,并且我需要在“for”循环中实现它们。所以我尝试了这个:

- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0;i<2;i++) {
UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, i*60, 100, 50)];
viewOne.backgroundColor=[UIColor redColor];

UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, i*60, 100, 50)];
viewTwo.backgroundColor=[UIColor purpleColor];

[self.view addSubview:[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3].view];
}
}

当我尝试循环时,第一个 View 动画正确,但其他 View 不正确。动画被跳过, View 切换直接进行。

有人知道为什么吗?我猜这是一个线程问题或类似的问题,但我对这些东西一无所知。欢迎任何帮助。谢谢。

最佳答案

viewDidLoad 的两个版本之间存在一点不一致。我会这样写循环的:

- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0;i<2;i++) {
UIView *viewOne=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewOne.backgroundColor=[UIColor redColor];

UIView *viewTwo=[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 50)];
viewTwo.backgroundColor=[UIColor purpleColor];

LMFlipViewController *flipViewController=[[LMFlipViewController alloc] initWithViewOne:viewThree viewTwo:viewFour animationDuration:0.5 andPauseInBetweenAnimation:3];
[flipViewController.view setFrame:CGRectMake(0, i*60, 100, 50)];
[self.view addSubview:flipViewController.view];

}
}

不知道这是否会有所改善。

还有另一个问题(因为你说你没有使用 ARC):你所有的 LMFlipViewController 对象都会泄漏,因为它们是分配/初始化的并且从未被释放(它们不可能是,因为它们是未存储,它们引用在退出 viewDidLoad 方法后只是“丢失”。

解决这个问题的方法是为您实例化的所有 Controller 保留一个 NSMutableArray:

self.flipControllers = [NSMutableArray arrayWithCapacity:...];

...

然后在 viewDidLoad(ARC 案例)中:

[self.flipControllers addObject:[[LMFlipViewController alloc] initWithViewOne:viewOne viewTwo:viewTwo animationDuration:0.5 andPauseInBetweenAnimation:3]];
[self.view addSubview:[self.flipControllers lastObject].view];

关于ios - 多个翻转动画不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13016543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com