我有一个CALayer,作为此CALayer的子图层,我添加了一个imageLayer,其中包含分辨率为276x183的图像。
我在主视图中添加了一个UIPanGestureRecognizer,并计算了CALayer的坐标,如下所示:
- (void)panned:(UIPanGestureRecognizer *)sender{
subLayer.frame=CGRectMake([sender locationInView:self.view].x-138, [sender locationInView:self.view].y-92, 276, 183);
}
在viedDidLoad中我有:
subLayer.backgroundColor=[UIColor whiteColor].CGColor;
subLayer.frame=CGRectMake(22, 33, 276, 183);
imageLayer.contents=(id)[UIImage imageNamed:@"A.jpg"].CGImage;
imageLayer.frame=subLayer.bounds;
imageLayer.masksToBounds=YES;
imageLayer.cornerRadius=15.0;
subLayer.shadowColor=[UIColor blackColor].CGColor;
subLayer.cornerRadius=15.0;
subLayer.shadowOpacity=0.8;
subLayer.shadowOffset=CGSizeMake(0, 3);
[subLayer addSublayer:imageLayer];
[self.view.layer addSublayer:subLayer];
它提供了所需的输出,但在模拟器中有点慢。我还没有在Device中测试它。所以我的问题是 - 移动包含图像的CALayer是否可以?
答案 0 :(得分:1)
是的,移动包含图像的CALayer是可以的。
如果要对平移手势做的只是移动图像,那么您应该只更新图层的frame
属性,而不是更新整个position
。像这样:
- (void)panned:(UIPanGestureRecognizer *)sender{
subLayer.position=CGPointMake([sender locationInView:self.view].x, [sender locationInView:self.view].y);
}
答案 1 :(得分:1)
两件事:
首先,您无法根据模拟器的性能得出任何结论。模拟器上的某些东西比设备上的速度快一个数量级,而其他东西则明显变慢。动画尤其混杂。
如果您正在进行性能关键型工作,请尽早并经常在设备上进行测试。
其次,您当然可以使用手势识别器为图层设置动画,但这是一种非常圆润的方式。手势识别器设计用于视图,将识别器绑定到子视图而不是子图层更容易,更清晰。
使用图层时遇到的一个重大问题是命中测试。如果你放开你的图像,然后尝试再拖动它,你必须在包含视图上有手势,采取手势坐标并对图层进行测试。啊。
看一下来自Apple的触摸示例应用程序的基于手势的版本。它向您展示了如何使用手势在屏幕上干净地移动UIView对象。
请注意,您可以创建包含自定义图层内容的视图,然后将其拖动。