使用UIPanGestureRecognizer在视图周围移动子图层是不错的选择?

时间:2012-09-04 07:19:48

标签: iphone ios core-animation calayer uigesturerecognizer

我有一个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是否可以?

2 个答案:

答案 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对象。

请注意,您可以创建包含自定义图层内容的视图,然后将其拖动。