还是老规矩,先上效果图。
当然这是我在公司做的的手机壳设计的DIY,其中就多个图层的手势移动做个简单的说明吧!
首先说一个图层的移动,比如一个SomeOneView,当然这个对象中还包含图片和边框。
我们创建好了对象之后,在创建一个全局的UIPanGestureRecognizer对象,初始化之后,
self.panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self
action:@selector(viewMoveWithPan:)];
self.panGes.delegate = self;
[self addGestureRecognizer:self.panGes];
这里的代理是为了解决多个手势的时候的冲突。(指的是一个图层上的多个手势)
这样我们就给我们的视图层加了移动手势了,接下来就是指明在哪个图层上移动的,这样我们需要确定它移动的父类图层,我这里的当然是手机壳背面的区域。
例如你的父视图是superView1,那么:
关于移动有两种方式:
1.根据transform的方式来。
CGPoint point = [panGes translationInView:superView1];
panGes.view.transform = CGAffineTransformTranslate(panGes.view.transform, point.x, point.y);
[panGes setTranslation:CGPointZero panGes.view];
2.根据CGPoint,用视图的中心点去移动。
@property (assign, nonatomic) CGPoint touchStart;
- (void)solidViewDidPan:(UIPanGestureRecognizer *)panGes {
if (panGes.state == UIGestureRecognizerStateBegan) {
self.touchStart = [panGes locationInView:self.superview];
}else if (panGes.state == UIGestureRecognizerStateChanged) {
CGPoint touch = [panGes locationInView:self.superview];
CGPoint newCenter = CGPointMake(self.center.x + touch.x - self.touchStart.x,
self.center.y + touch.y - self.touchStart.y);
self.center = newCenter;
self.touchStart = touch;
}else if (panGes.state == UIGestureRecognizerStateEnded) {
}
}
当然每一种都有各自的好处,第一种方式比较简洁,但不利于去确定视图的移动范围,比如想要在移动到中间的时候,出现校准线。这样用第二种方式就会比较容易,通过用移动图层的中心点是否在中间的某一个区域中的时候,就会出现瞄准线,同时显时的设置移动图层的中心点即可。
例如代码:
static CGFloat const YOFFSET = 8;
static CGFloat const XOFFSET = 8;
if ((newCenter.x > panView.width/2.0 - XOFFSET &&
newCenter.x < panView.width/2.0 + XOFFSET) &&
(newCenter.y > panView.height/2.0 - YOFFSET &&
newCenter.y < panView.height/2.0 + YOFFSET)) {
newCenter.x = panView.width/2.0;
newCenter.y = panView.height/2.0;
view.center = newCenter;
[[FMGlobal getFreeDesignVC] showHLineViewWithFlag:YES];
[[FMGlobal getFreeDesignVC] showVLineViewWithFlag:YES];
return;
}
当然这只是部分的代码,重要的是说这个实现起来的思路而已。