transitionFromView:和翻转的奇怪行为。

时间:2012-08-07 14:05:11

标签: ios objective-c uiviewanimation uiviewanimationtransition uiviewanimation-curve

我有一个图片墙(UIScrollView),在那里我有很多UIImageView's

这是我的代码:

for (ThumbPosterModel *tPoster in _thumbsPosterStack) {

    UIImageView *imageView = [[UIImageView alloc] initWithImage:tPoster.thumb];
    imageView.userInteractionEnabled = YES;
    imageView.frame = CGRectMake(i, imageView.frame.origin.y, imageView.frame.size.width, imageView.frame.size.height);

    [tPoster setTag:tag];
    [_posterTagArr addObject:(BasicPosterModel*)tPoster];

    imageView.tag = tag;
    tag++;
    [posterWallScrollView addSubview:imageView];

    UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageDoubleTapped:)];
    doubleTap.numberOfTapsRequired = 2;
    [imageView addGestureRecognizer:doubleTap];
}

这是我的IBAction:

-(IBAction)imageDoubleTapped:(id)sender {
    NSInteger selectTag = (((UIGestureRecognizer*)sender).view.tag);
    for (BasicPosterModel *bPoster in _posterTagArr) {
        if(bPoster.tag == selectTag) {
            [UIView transitionFromView:(UIImageView*)((UIGestureRecognizer*)sender).view
                                toView:mySecordView //let's say next ImageView. Doesn't matter
                              duration:1.0
                               options:UIViewAnimationOptionTransitionCrossDissolve  
                            completion:^(BOOL finished) {
                                // animation completed
                            }];

        }
    }
}

当我使用时:

UIViewAnimationOptionTransitionCrossDissolve这对ScrollView中的图片有效 ONLY 。 当我在此代码UIViewAnimationOptionTransitionFlipFromTop中使用时,这会影响我的scrollView。

怎么可能?

当然,我想将动画效果仅用于单张图像。

4 个答案:

答案 0 :(得分:10)

以下是过渡在概念上的运作方式:

  1. 系统将fromView的父视图的当前状态呈现为屏幕外缓冲区(“之前”状态)
  2. 从其父视图中删除了fromView
  3. toView被添加到parentView(可以是nil,你是对的;在这种情况下没有添加任何内容)
  4. 系统将父视图呈现为屏幕外缓冲区(“之后”状态“)
  5. 系统将父视图从“之前”状态转换为“之后”状态
  6. 在您的情况下,父视图是滚动视图,因此整个滚动视图已转换。与您的感知相反,即使使用交叉溶解也是如此。只是大多数的scrollview(未被fromView覆盖的部分)在之前和之后都是相同的,所以看起来好像那部分没有参与过渡 - 但确实如此。

    如果我理解正确,你在滚动视图中水平排列多个图像视图堆栈,每当有人双击堆叠中的“最上面”图像视图时,你想要“显示”它正下方的图像,而不影响其他堆栈。

    如果为每个与堆栈大小相同的堆栈向scrollView添加容器视图,并将此堆栈的所有ImageViews放入此容器视图中而不是直接放入滚动视图中,它将起作用。点击,只需按照您最初的操作从点击视图转换为nil。屏幕上的过渡尺寸将仅限于容器视图(粗略地说 - 卷曲和翻转使用其框架之外的一些空间)。

    根据您的要求,您可能希望在删除堆栈中的最后一个图像后删除堆栈的容器视图。

答案 1 :(得分:2)

原因是UIViewAnimationOptionTransitionFlipFromTop仅在iOS 5.0

之后可用

来自UIView Class Reference

  

UIViewAnimationOptionTransitionFlipFromTop
  从顶部到底部围绕其水平轴翻转视图的过渡。视图的顶侧朝向后方向前侧和底侧移动   适用于iOS 5.0及更高版本。
  在UIView.h中声明。

因此,在iOS 4.3中,它可能会导致不可预测的行为。

答案 2 :(得分:0)

首先,您需要列出toView才能正确使用transitionFromView

以下是Apple's example如何完成的工作:

[UIView transitionFromView:(displayingPrimary ? primaryView : secondaryView)
        toView:(displayingPrimary ? secondaryView : primaryView)
        duration:1.0
        options:(displayingPrimary ? UIViewAnimationOptionTransitionFlipFromRight :
                    UIViewAnimationOptionTransitionFlipFromLeft)
        completion:^(BOOL finished) {
            if (finished) {
                displayingPrimary = !displayingPrimary;
            }
    }];

我也相信transitionFromView假设将superView作为参数。

此外,我 认为 将UImageView添加到容器UIView并对容器执行操作,而不是直接在UIImageView上执行操作是更好的做法。因为基本上你需要一个“父”UIView来制作动画,同时在动画中添加和删除子视图。

答案 3 :(得分:-1)

正如Cory所说,transitionFromView:toView:看起来像是要有目的地视图。如果您只想淡出视图,为什么不使用仅用于单个视图的方法,例如transitionView:duration:options:animations:completion。

文档中的示例似乎完全符合您的要求。

[UIView transitionWithView:containerView
       duration:0.2
       options:UIViewAnimationOptionTransitionFlipFromLeft
       animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; }
       completion:NULL];