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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 18:20:58  来源:igfitidea点击:

Move UIView with relation to touch

iphoneobjective-ciosuiview

提问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.

touchesBegantouchesMoved方法修改为如下所示。

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 UIViewControllersubclass):

您想要的是使用UIPanGestureRecognizeriOS 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];
        }
    }
}