Переместить UIView относительно касания - PullRequest
15 голосов
/ 20 декабря 2010

Я пытаюсь переместить UIView относительно касаний пользователя.

Вот что у меня есть на данный момент:

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;
}

Вид продолжает мерцать из одного места в другое, и я не знаю, что еще делать.

Любая помощь приветствуется.

Ответы [ 4 ]

65 голосов
/ 20 декабря 2010

То, что вы хотите, это использовать 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];
   }
}
14 голосов
/ 20 декабря 2010

Измените методы touchesBegan и touchesMoved так, как показано ниже.

float oldX, oldY;
BOOL dragging;

Метод затрагивает Начало: 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;
    }
}

Метод touchMoved: 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;
    }
}

Метод touchEnded: withEvent: .

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    dragging = NO;
}
1 голос
/ 24 апреля 2018

// Над ответом в Swift 4.0

var draging: 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
}
1 голос
/ 29 января 2016

Вот код в 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)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...