1

我一直在尝试为图像视图设置动画以在屏幕上向上滑动。当位置向上移动时,视图高度也会增加。

在我的 iPhone 4S (5.x) 上,图像视图的行为与预期一致,视图仅随着其高度的增加而向上移动,但是在我的 iPhone 3G (4.1) 上,视图在此动画期间向下移动了一点。

当图像视图用于创建不昂贵的阴影效果时,需要这样的精度水平。它的对齐对于效果很重要。该图像是可调整大小的图形。

这就是我更改视图位置和大小的方式

  CGRect oldShadow = self.shaddowView.frame;
  oldShadow.size.height = oldShadow.size.height+200;
  oldShadow.origin.y = oldShadow.origin.y - 200;
  self.shaddowView.frame =oldShadow;

这是视图的图像设置为可调整大小的方式:

  UIImage* shadow = [[UIImage imageNamed:@"shadow.png"] stretchableImageWithLeftCapWidth:20 topCapHeight:20];
self.shaddowView.image = shadow;

谢谢。

4

1 回答 1

0

我使用了以下动画,不仅在起始位置而且在预期的最终位置周围都有一个边框,这样我就可以确认是否发生了任何不希望的视图移动(除了明显的向上扩展),但它工作正常iOS 4.2.1:

[UIView animateWithDuration:2.0
                 animations:^{
                     CGRect newImageFrame = imageView.frame;
                     newImageFrame.origin.y -= stretchBy;
                     newImageFrame.size.height += stretchBy;
                     imageView.frame = newImageFrame;
                 }];

我没有 iOS 4.1 设备(我的旧 3G 测试手机运行的是 iOS 4.2.1,该设备支持的最新 iOS 版本),所以我不能说,但 iOS 4.2.1 没问题.

不过,我必须承认,我发现当您对帧的更改进行动画处理时,最终帧不太可能与您指定的完全相同。如果你NSLog完成时的框架,它是不是正确的值?或者你是说它在动画过程中暂时移动但最终在正确的位置?或者它在动画期间向下移动并且即使动画完成也最终处于错误的位置?

我想知道是否还有其他事情发生(例如,您的动画视图是滚动视图的子视图,它本身可能会发生变化?或者这里没有显示一些代码在动画之后意外地进一步调整帧?等等)。似乎有点调试应该确认框架是否实际上不是您想要的,或者是否存在其他问题。


我最初回答了建议shouldRasterize选项,但如果您尝试支持旧的 iPhone 3G 设备,那么这可能还不够好。这些旧手机肯定有点口吃。无论如何,这是我原来的答案:

我假设您这样做是因为layer阴影功能有点占用 CPU。但我听说(但不能说)如果你使用这个shouldRasterize选项,它会好一点:

viewThatNeedsShadow.layer.shadowColor = [UIColor blackColor].CGColor;
viewThatNeedsShadow.layer.shadowOffset = CGSizeMake(3.0, 3.0);
viewThatNeedsShadow.layer.shadowOpacity = 0.5;
viewThatNeedsShadow.layer.shouldRasterize = YES;
viewThatNeedsShadow.clipsToBounds = NO;
于 2012-10-07T15:52:57.837 回答