【问题标题】:transitionFromView: and strange behavior with flip.transitionFromView: 和翻转的奇怪行为。
【发布时间】:2012-08-07 14:05:10
【问题描述】:

我有一面图片墙 (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 这是 ONLY 对我在 ScrollView 中的图像的影响。 当我在此代码中使用UIViewAnimationOptionTransitionFlipFromTop 时,这会影响我的滚动视图。

这怎么可能?

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

【问题讨论】:

  • 您确定您使用的是 iOS>=5 吗?
  • 不,我的目标是 iOS 4.3。但是transitionFromView:toView:.. 在 iOS >=4.0 中可用
  • 但 UIViewAnimationOptionTransitionFlipFromTop 自 iOS 5.0 起才可用,请参阅我的答案和链接)
  • 但是使用 `UIViewAnimationOptionTransitionCurlUp' 我得到了同样的错误
  • 我仍然认为较小的容器视图可以解决您的问题(请参阅下面的答案)。您能否向我们展示您尝试过但不起作用的代码?

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


【解决方案1】:

从概念上讲,转换的工作原理如下:

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

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

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

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

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

【讨论】:

  • 我完全不明白为什么在您的情况下,父视图是滚动视图......为什么父视图是滚动视图。它应该是 UIImageView。
  • 好吧,我不能告诉你为什么会这样,这是苹果框架工程师的问题。事实是:屏幕上动画影响的区域是你给方法的fromView的父视图的区域。您的fromView 是您已添加为UIScrollView 的子视图的UIImageView。所以动画会影响UIScollView 的区域。如果您想要更小的区域,请将UIImageView 设为更小视图的子视图。
【解决方案2】:

原因是 UIViewAnimationOptionTransitionFlipFromTop 仅在 iOS 5.0 后可用

来自UIView Class Reference

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

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

【讨论】:

  • 我也在尝试UIViewAnimationOptionTransitionCurlUp,但也没有用。它在 iOS 4.0+ 中可用
【解决方案3】:

首先,您需要列出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 来制作动画,而在动画期间添加和删除子视图。

【讨论】:

  • 为什么? UIImageView 是 UIView 的子类。为什么我有一个额外的容器呢? developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/…
  • 我意识到这一点。问题是它们必须是分配动画的“父”视图。那是一个UIView。您向父级添加和删除 UIImageView 以创建动画效果。如果你只是翻转一个 imageView 什么都不会发生。删除顶部图像并添加新图像以及翻转是使动画....看起来像动画的原因。
【解决方案4】:

正如 Cory 所说,transitionFromView: toView: 看起来像是打算有一个目标视图。如果您只想淡出一个视图,为什么不使用只在单个视图上工作的方法,例如 transitionView:duration:options:animations:completion。

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

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

【讨论】:

  • 不,我不能——我想要transitionFrom..To..。就像我在评论零替换中所说的那样 - 没有用。这不是解决这个问题的方法,它只是隐藏一个问题!
猜你喜欢
  • 2023-03-14
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多