2016-10-05 2 views
1

У меня есть изображение на экране, которое можно перетаскивать. Это уже работает. Когда я положил палец посередине. Так же, как я поместил палец в любой угол (или что-то еще, что не посередине), середина изображения попадает под мой палец. Но я все еще хочу иметь угол.Как перетаскивать изображения с быстрым точно?

Вот мой код:

let frameDoor = CGRect(x: 100, y: 100, width: 200, height: 400) 
var doorView = ObjectView(frame: frameDoor) 
doorView.image = UIImage(named: "door") 
doorView.contentMode = .scaleAspectFit 
doorView.isUserInteractionEnabled = true 
self.view.addSubview(doorView) 

ObjectView:

import UIKit 

class ObjectView: UIImageView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     var touch = touches.first 
     self.center = (touch?.location(in: self.superview))! 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Есть ли решение для этого?

ответ

1

Ваша проблема здесь self.center = (touch?.location(in: self.superview))!.

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

Я не могу проверить код прямо сейчас, но он должен дать вам представление о том, как это сделать.

var initialLocation: CGPoint?  
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
    var touch = touches.first 
    initialLocation = CGPoint(x: (touch?.location(in: self.superview))!.x - self.center.x, y: (touch?.location(in: self.superview))!.y - self.center.y) 
} 


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
    var touch = touches.first 
    self.center = CGPoint(x: (touch?.location(in: self.superview)).x! - initialLocation.x, y: (touch?.location(in: self.superview)).y! - initialLocation.y) 
} 
+0

Спасибо! Я попробовал, но теперь изображение уже не под пальцем. Может быть, я могу это исправить ... –

+0

@chocolatecake, я отредактировал ответ. Теперь вычисляется 'initialLocation'. Не забудьте сбросить его, когда касания закончены или отменены. –

+0

Да, теперь это работает! Я просто исправил это, добавив вторичный 'initialLocation', который содержит начальное местоположение объекта. И я вычислил новую позицию следующим образом: 'let xPos = ((touch? .location (in: self.superview)) ?. x)! - initialLocationFinger! .x; let yPos = ((touch? .location (in: self.superview)) ?. y)! - initialLocationFinger! .y; self.center = CGPoint (x: initialLocationObject! .x + xPos, y: initialLocationObject! .y + yPos); ' Но я думаю, что ваше решение умнее;) –

Смежные вопросы