ios 相对于触摸移动 UIView
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4488823/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Move UIView with relation to touch
提问by Hyman Greenhill
i'm trying to move a UIView with relation to the user's touches.
我正在尝试移动与用户触摸相关的 UIView。
Here's what I have at the moment:
这是我目前所拥有的:
int oldX, oldY;
BOOL dragging;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if (CGRectContainsPoint(window.frame, touchLocation)) {
dragging = YES;
oldX = touchLocation.x;
oldY = touchLocation.y;
}
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if (CGRectContainsPoint(window.frame, touchLocation) && dragging) {
CGRect frame;
frame.origin.x = (window.frame.origin.x + touchLocation.x - oldX);
frame.origin.y = (window.frame.origin.y + touchLocation.y - oldY);
window.frame = frame;
}
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
dragging = NO;
}
The view keeps flickering from one location to another, and I don't know what else to do.
视图不断从一个位置闪烁到另一个位置,我不知道还能做什么。
Any help appreciated.
任何帮助表示赞赏。
采纳答案by EmptyStack
Modify the touchesBeganand touchesMovedmethods to be like the following.
将touchesBegan和touchesMoved方法修改为如下所示。
float oldX, oldY;
BOOL dragging;
The touchesBegan:withEvent:method.
该的touchesBegan:withEvent:方法方法。
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if (CGRectContainsPoint(window.frame, touchLocation)) {
dragging = YES;
oldX = touchLocation.x;
oldY = touchLocation.y;
}
}
The touchesMoved:withEvent:method.
该touchesMoved:withEvent:方法方法。
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.view];
if (dragging) {
CGRect frame = window.frame;
frame.origin.x = window.frame.origin.x + touchLocation.x - oldX;
frame.origin.y = window.frame.origin.y + touchLocation.y - oldY;
window.frame = frame;
}
}
The touchesEnded:withEvent:method.
在touchesEnded:withEvent:方法方法。
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
dragging = NO;
}
回答by PeyloW
What you want is to use a UIPanGestureRecognizer
, introduced in iOS 3.2. You use it with something as easy as this (from your UIViewController
subclass):
您想要的是使用UIPanGestureRecognizer
iOS 3.2 中引入的 , 。您可以像这样简单地使用它(来自您的UIViewController
子类):
-(void)viewDidLoad;
{
[super viewDidLoad];
UIPanGestureRecognizer* pgr = [[UIPanGestureRecognizer alloc]
initWithTarget:self
action:@selector(handlePan:)];
[self.panningView addGestureRecognizer:pgr];
[pgr release];
}
-(void)handlePan:(UIPanGestureRecognizer*)pgr;
{
if (pgr.state == UIGestureRecognizerStateChanged) {
CGPoint center = pgr.view.center;
CGPoint translation = [pgr translationInView:pgr.view];
center = CGPointMake(center.x + translation.x,
center.y + translation.y);
pgr.view.center = center;
[pgr setTranslation:CGPointZero inView:pgr.view];
}
}
回答by user3069232
Here is code in Swift, a slightly more generalist version that works with an ImageView that has been created on the screen.
这是 Swift 中的代码,这是一个稍微通用的版本,可与在屏幕上创建的 ImageView 一起使用。
let panGestureRecongnizer = UIPanGestureRecognizer(target:self, action: "handlepan:")
imageView.addGestureRecognizer(panGestureRecongnizer)
func handlepan(sender: UIPanGestureRecognizer) {
if (sender.state == UIGestureRecognizerState.Changed) {
var center = sender.view?.center
let translation = sender.translationInView(sender.view)
center = CGPointMake(center!.x + translation.x, center!.y + translation.y)
sender.view?.center = center!
sender .setTranslation(CGPointZero, inView: sender.view)
}
}
回答by Avneesh Agrawal
//Above answer in Swift 4.0
//以上答案在 Swift 4.0
var dragging: Bool = false
var 拖动:Bool = false
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = event?.allTouches?.first
let touchPoint = touch?.location(in: self.window)
i
if viewToDrag.frame.contains(touchPoint!){
dragging = true
}
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch = event?.allTouches?.first
let touchPoint = touch?.location(in: self.window)
if (dragging) {
viewToDrag.center = CGPoint(x: (touchPoint?.x)!, y: (touchPoint?.y)!)
}
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
dragging = false
}
回答by BoSoud
@PeyLoW answer is the answer I suggest and add limit to parent boundaries
@PeyLoW 答案是我建议的答案,并为父边界添加限制
-(void)handlePan:(UIPanGestureRecognizer*)pgr;
{
if (pgr.state == UIGestureRecognizerStateChanged) {
CGPoint center = pgr.view.center;
CGPoint translation = [pgr translationInView:pgr.view];
center = CGPointMake(center.x + translation.x,
center.y + translation.y);
if ([self pointInside:center withEvent:nil])
{
pgr.view.center = center;
[pgr setTranslation:CGPointZero inView:pgr.view];
}
}
}