UIScrollView strange zoom behavior when content is a UIView subclass
- by sigsegv
Hi, I'm experiencing the following: I created a UIView subclass with a CATiledLayer as backing layer by overriding the layerClass method. The layer properties (delegate, tileSize, etc) are set in the initWithFrame: method of the subclass.
+(Class)layerClass {
return [CATiledLayer class];
}
-(id)initWithFrame:(CGRect)frame {
if(self = [super initWithFrame:frame]) {
renderer = [[MFPDFRenderer alloc]init];
tiledLayer = (CATiledLayer *)[self layer];
[tiledLayer setFrame:frame];
[tiledLayer setLevelsOfDetail:2];
[tiledLayer setLevelsOfDetailBias:3];
[tiledLayer setTileSize:CGSizeMake(512, 512)];
[tiledLayer setDelegate:renderer];
}
return self;
}
Then I add an instance of said class as the content of an UIScrollView and set UIScrollView properties and implement the required delegate's methods.
Everything works fine but when zooming the scroll view keep repositioning itself on its center. It's hardly noticeable when zooming in the center of the content, but unbearable otherwise.
The same scroll view works fine when I use as (zoomable) content any other view such as an UIImageView or even a normal UIView with a CATiledLayer with the same properties and delegate of the subclass implementation as sublayer. When I check layer bounds and frame in the drawLayer:inContext: method of the delegate I get the following result as the zoom increase
UIView with CATiledLayer as sublayer:
2010-04-03 21:05:33.499 Renderer[89293:4903] Layer: (0.000, 0.000) 320.000 x 460.000
2010-04-03 21:05:33.500 Renderer[89293:4903] Bounds: (0.000, 0.000) 320.000 x 460.000
2010-04-03 21:05:33.529 Renderer[89293:4903] Layer: (0.000, 0.000) 320.000 x 460.000
2010-04-03 21:05:33.534 Renderer[89293:4903] Bounds: (0.000, 0.000) 320.000 x 460.000
Custom subclass:
2010-04-03 21:04:15.969 Renderer[88957:4903] Layer: (0.000, 0.000) 657.910 x 945.746
2010-04-03 21:04:15.970 Renderer[88957:4903] Bounds: (0.000, 0.000) 320.000 x 460.000
2010-04-03 21:04:17.428 Renderer[88957:4903] Layer: (-0.000, 0.000) 766.964 x 1102.510
2010-04-03 21:04:17.429 Renderer[88957:4903] Bounds: (0.000, 0.000) 320.000 x 460.000
[...]
2010-04-03 21:19:10.388 Renderer[92573:4903] Layer: (-0.000, 0.000) 905.680 x 1301.916
2010-04-03 21:19:10.388 Renderer[92573:4903] Bounds: (0.000, 0.000) 320.000 x 460.000
I suppose that's the culprit or at least another symptom. I can add that I get the same erratic behavior if my subclass is built over a standard CALayer with the same renderer.
Any suggestion will be appreciated!