我正在尝试开发过渡效果,当一个视图分成两部分时,上部向上动画,下部向下动画以陶醉其背后的视图。 我使用UIView和UIImageView方法来实现:
// 1. Make a screenshot:
UIGraphicsBeginImageContext(parentView.frame.size);
[parentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// 2. Calculate rectangles for top and bottom part:
CGRect rectTop, rectBottom;
CGFloat W = rectBig.size.width;
CGFloat H = rectBig.size.height;
rectTop = CGRectMake(0, 0, W, y_cutoff);
rectBottom = CGRectMake(0, y_cutoff, W, H - y_cutoff);
// 3. Create top and bottom images:
CGImageRef imageRefTop = CGImageCreateWithImageInRect([screenshot CGImage], rectTop);
CGImageRef imageRefBottom = CGImageCreateWithImageInRect([screenshot CGImage], rectBottom);
UIImage *imageTop = [UIImage imageWithCGImage:imageRefTop];
UIImage *imageBottom = [UIImage imageWithCGImage:imageRefBottom];
// 4. Assign images to image views:
imageViewTop.image = imageTop;
imageViewBottom.image = imageBottom;
// 5. Animate image views:
[UIView beginAnimation:nil context:NULL];
.... animation code here
[UIView commitAnimations];
然而,此代码在设备上速度极慢,我确信有更有效的方法来实现此类转换。最有可能使用CALayers等。 你能指出我正确的方向吗?
答案 0 :(得分:2)
动画本身不应该很慢。你真正需要做的就是改变动画的两个视图的Y位置。
为什么不尝试将静态图像放入UIImageViews并观察动画的表现呢?
如果在创建图像时发生滞后,也许您应该考虑将该代码移动到单独的线程中,以便主线程不会冻结。创建完图像后,通知主线程,将它们放入UIImageViews,然后执行动画。
答案 1 :(得分:2)
这不是动画。你的绘图代码很慢。如果您进行了分析,您会看到renderInContext:
(顺便说一句,总是在主线程上执行)和CGImageCreateWithImageInRect
是限制因素。你的观点(你要分裂的那个)是关于什么的?是否可以选择从开始创建两个视图而不是一个?