8

我有一面图像墙 ( 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 中的图像有影响。当我在这段代码中使用 UIViewAnimationOptionTransitionFlipFromTop这会影响我的滚动视图。

怎么可能?

当然,我希望我的动画效果只适用于单个图像。

4

4 回答 4

10

以下是转换在概念上的工作方式:

  1. 系统将fromView的父视图的当前状态渲染到离屏缓冲区(“之前”状态)
  2. fromView 从其父视图中移除
  3. toView 被添加到 parentView (可以为零,你是对的;在这种情况下,什么都没有添加)
  4. 系统将父视图渲染到屏幕外缓冲区(“之后”状态)
  5. 系统动画父视图从“之前”状态到“之后”状态的转换

在您的情况下,父视图是滚动视图,因此整个滚动视图都已转换。与您的看法相反,即使使用交叉溶解也是如此。只是大部分滚动视图(fromView 未覆盖的部分)在前后是相同的,因此看起来该部分似乎不参与转换 - 但确实如此。

如果我理解正确,您正在滚动视图中水平排列多个图像视图堆栈,并且每当有人双击堆栈中的“最上面”图像视图时,您希望直接在其下方“显示”图像,而不影响其他堆栈。

如果为这些堆栈中的每一个都添加一个与堆栈大小相同的容器视图到滚动视图,并将此堆栈的所有 ImageView 放入此容器视图而不是直接放入滚动视图,它将起作用。在点击时,只需像最初那样从点击视图转换为 nil 即可。屏幕上的过渡尺寸将仅限于容器视图(大致 - 卷曲和翻转使用超出其框架的一些空间)。

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

于 2012-08-14T16:25:23.653 回答
2

原因是它UIViewAnimationOptionTransitionFlipFromTop仅在 iOS 5.0 之后可用

来自UIView 类参考

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

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

于 2012-08-16T13:48:43.090 回答
0

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

以下是Apple 的示例

[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 来制作动画,而在动画期间添加和删除子视图。

于 2012-08-07T17:36:41.070 回答
-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];
于 2012-08-14T09:00:27.443 回答