1

我有一个有点滞后的动画,我把它缩小到这个:

作为动画的一部分, aUIScrollView会自动滚动。即使子视图似乎已加载,但如果它们在滚动视图边界之外,则将drawRect:在这些视图上调用它们,因为它们被动画化回可见区域(我在drawRect:这些视图中的每一个上实现我自己的)。这就是让我的动画卡顿的原因。

对于滚动视图的每个子视图,我都将 shouldRasterize 设置为 true,没有区别。UIScrollView即使超出滚动视图的范围,我如何强制将每个视图保留在内存中?

4

2 回答 2

1

将您的绘图代码从绘图矩形移到其他方法中。而不是渲染到视图的上下文中,而是渲染到图像上下文中。将此方法添加到绘图代码的开头以创建图像上下文:

UIGraphicsBeginImageContextWithOptions(
   CGSize size,
   BOOL opaque,
   CGFloat scale
);

像这样使用它:

UIGraphicsBeginImageContextWithOptions(
   self.bounds.size,
   NO,       //if you are doing rounded corners or anything, else YES
   0.0       //Scales automatically for retina displays
);

//Need a reference to the context you just made?
CGContextRef ctx = UIGraphicsGetCurrentContext();

您的 CG 绘图代码正常工作。然后将上下文渲染为图像

UIImage * renderedImage = UIGraphicsGetImageFromCurrentImageContext();

别忘了

UIGraphicsEndImageContext();

从只需要绘制一次的地方调用这个绘图代码。这些是您可以覆盖的一些候选方法:

- (void)willMoveToSuperview:(UIView *)newSuperview //called when adding to a view
- (void)layoutSubviews  //called when first displayed, on frame change and after setNeedsLayout has been called.

然后在视图上设置这些图像。如果你有按钮,你应该有 UIButton 的子类。您现在可以- (void)setImage:(UIImage *)image forState:(UIControlState)stateEt 瞧,表演!

于 2013-01-09T13:56:03.367 回答
0

我认为你这样做是错误的。而不是让 UIScrollView 告诉它的子视图绘制或不绘制不是要走的路。Apple 通过创建排队系统确实解决了 UITableViews 的这个问题。如果没有可重用的子视图,则将子视图排入队列。

大约一年前,我写了自己的收藏视图,这就是我必须走的路。它还可以节省内存,因为您正在重用子视图而不是创建新视图。

我知道它涉及更多,但它肯定会解决您的问题。

从 Apple 查看这段代码,他们使用类似的东西。

https://developer.apple.com/library/ios/#samplecode/PhotoScroller/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010080

于 2013-01-09T13:08:08.793 回答