我想点击UIView并拖动并按照我的手指操作,简单就够了。但最简单的方法是将对象中心设置为点击发生的位置(这不是我想要的),我希望它移动,就好像你在任何地方抓住它一样抓住了对象。
有一种非常有用的方法可以做到这一点,它是在其中一个iTunes U视频中引用的。该脚本没有使用deltaX,deltaY来拖动你点击它下面的图像,而不是让它在你的手指下面居中但是我不记得那个代码是什么了!
有没有人引用此代码?或者也许有一种有效的方法可以在没有uiview.center = tap.center概念的情况下在手指下移动UIViews?
答案 0 :(得分:11)
以下代码是一个简单的手势识别器示例,它允许面板/视图移动。您不是修改中心,而是修改原点[基本上通过为目标视图设置新框架]。
您可以在您的情况下对此进行优化,这样您就不必深入了解gesture.view ......等等。
-(void)dragging:(UIPanGestureRecognizer *)gesture
{
if(gesture.state == UIGestureRecognizerStateBegan)
{
//NSLog(@"Received a pan gesture");
self.panCoord = [gesture locationInView:gesture.view];
}
CGPoint newCoord = [gesture locationInView:gesture.view];
float dX = newCoord.x-panCoord.x;
float dY = newCoord.y-panCoord.y;
gesture.view.frame = CGRectMake(gesture.view.frame.origin.x+dX, gesture.view.frame.origin.y+dY, gesture.view.frame.size.width, gesture.view.frame.size.height);
}
Swift 4:
@objc func handleTap(_ sender: UIPanGestureRecognizer) {
if(sender.state == .began) {
self.panCoord = sender.location(in: sender.view)
}
let newCoord: CGPoint = sender.location(in: sender.view)
let dX = newCoord.x - panCoord.x
let dY = newCoord.y - panCoord.y
sender.view?.frame = CGRect(x: (sender.view?.frame.origin.x)!+dX, y: (sender.view?.frame.origin.y)!+dY, width: (sender.view?.frame.size.width)!, height: (sender.view?.frame.size.height)!)
}
答案 1 :(得分:7)
以下是来自Apple的MoveMe项目的代码,关键是在touchesMoved
方法中执行此操作。它允许UIView
(PlacardView
)看到触摸并移动到用户触摸的任何位置。希望这会有所帮助。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
// If the touch was in the placardView, move the placardView to its location
if ([touch view] == placardView) {
CGPoint location = [touch locationInView:self];
placardView.center = location;
return;
}
}
答案 2 :(得分:0)
我认为你在谈论潜行者应用......
// Tell the "stalker" rectangle to move to each touch-down
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[UIView beginAnimations:@"stalk" context:nil];
[UIView setAnimationDuration:1];
//[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationBeginsFromCurrentState:YES];
// touches is an NSSet. Take any single UITouch from the set
UITouch *touch = [touches anyObject];
// Move the rectangle to the location of the touch
stalker.center = [touch locationInView:self];
[UIView commitAnimations];
}
答案 3 :(得分:0)
您可以保存您触摸的点(T)和视图的当前位置(O)。在touchMoved中,您可以通过添加(O-T)来基于新点移动它。