0

我有几个手势识别器可以左右滑动图像或 vv,具体取决于滑动的方向。但我希望动画更流畅。到目前为止,这是我的代码:

-(void)swipeNext:(id)sender{
    //0 Get the currentview as referenced by pageControl
    UIImageView *oldView = [views objectAtIndex:currentViewIndex];
    //MOVE ON TO NEW VIEW
    currentViewIndex ++;
    NSLog(@"left swiped  - currentViewIndex:%d", currentViewIndex);
    UIImageView *newView = [views objectAtIndex:currentViewIndex];
    //NSLog(@"views objectAtIndex = %@",[views objectAtIndex:[self.pageControl currentPage]]);

    //1 Animate out the old view
    newView.frame = oldView.frame;
    newView.center = CGPointMake(oldView.center.x + CGRectGetWidth(oldView.frame), oldView.center.y);
    [oldView.superview addSubview: newView];

    [UIView animateWithDuration:1.0
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseIn //UIViewAnimationOptionRepeat | UIViewAnimationOptionAutoreverse
                     animations:^{
                         newView.center = oldView.center;
                         oldView.center = CGPointMake(oldView.center.x - CGRectGetWidth(oldView.frame), oldView.center.y);

                     }
                     completion:nil];
}

我想让它快一点。我已经发布了对我试图模仿的应用程序的引用,DunkinDonuts(Dunkin Donuts 应用程序使用什么样的视图控制器)并且他们似乎使用了 UIPageControl,我一开始尝试使用但无法确定滑动的方向(如何使用 UIPageControl 从左到右为 UIImageView 设置动画?),所以我切换到了 Gestures。但是,如果您看到他们的应用程序,则滑动速度会更快。

4

2 回答 2

1

我发现要添加格式正确(可读)的代码块,我不能使用注释。有人建议我使用答案作为对原始问题的更新。所以就在这里。

更新

我像这样修改了我的代码。与往常一样,viewDidLoad 调用 createUIViews 来执行此操作:

-(void)createUIViews{
    UIImage *image1 = [UIImage imageNamed:@"GiftCard.png"];
    firstView = [[UIImageView alloc] initWithImage:image1];

    CGRect newFrame1 = firstView.frame;
    newFrame1.origin.x = 50;
    newFrame1.origin.y = 10;
    firstView.frame = newFrame1;

    UIImage *image2 = [UIImage imageNamed:@"MyCard.png"];
    secondView = [[UIImageView alloc] initWithImage:image2];

    CGRect newFrame2 = secondView.frame;
    newFrame2.origin.x = 350;//CGRectGetWidth(firstView.superview.frame)/2;
    newFrame2.origin.y = 10;
    secondView.frame = newFrame2;

    //Add all Views offscreen except #1
    [self.scrollView addSubview:firstView]; //added ONSCREEN
    [self.scrollView addSubview:secondView]; //added OFFSCREEN
}

这会将屏幕上的 firstView 和右侧的 secondView 设置为关闭。

手势识别器也在 viewDidLoad 中设置。他们调用 swipeNext,如下所示:

-(void)swipeNext:(id)sender{
//0 Get the currentview as referenced by pageControl
oldView = [views objectAtIndex:currentViewIndex];
//MOVE ON TO NEW VIEW
currentViewIndex ++;
newView = [views objectAtIndex:currentViewIndex];

//1 Animate out the old view **(Aaron, youre right, dont need this anymore)**
//newView.frame = oldView.frame;
//newView.center = CGPointMake(oldView.center.x + CGRectGetWidth(oldView.frame), oldView.center.y);
//[oldView.superview addSubview: newView];

[UIView animateWithDuration:1.0
                      delay: 0.0
                    options: UIViewAnimationOptionCurveEaseIn 
                 animations:^{
                     newView.center = oldView.center;
                     oldView.center = CGPointMake(oldView.center.x - CGRectGetWidth(oldView.frame), oldView.center.y);

                 }
                 completion:nil];

我注释掉了 addSubview 因为我把它移到了 createUIViews 方法。它的工作原理是一样的,我认为这只是速度问题或我缺少的一些动画功能。我希望我可以添加一个视频。原始的 DD 应用程序看起来像 UIPageControl 一样可以更快地制作动画(我认为)这是一个视频链接。缓慢的 iOS UIView 动画

于 2013-03-15T16:00:05.190 回答
0

在启动同一视图的动画的同一轮事件循环期间将视图添加到视图层次结构是导致性能不佳和其他奇怪动画故障的秘诀。在您的代码中,您知道在调用 swipeNext 之前 newView 将是什么。是[views objectAtIndex:currentViewIndex + 1]。我建议您在当前视图完成动画就位后,将 newView(以及之前的视图)添加到视图层次结构中。例如,在视图层次结构中放置“nextView”和“previousView”的代码可以放在动画的完成块中。提前将 nextView 和 previousView 放入视图层次结构中,但不在屏幕上。然后在 swipeToNext 中,您可以只为中心设置动画,并避免在动画完成之前修改视图层次结构。

于 2013-03-15T05:43:47.610 回答