2016-12-08 1 views
5

Я разрабатываю приложение, которое пользователь сможет перетаскивать элементы на холсте, и когда он отпускает изображение, оно нарисовано на холсте.Как распознать, какое изображение было затронуто

Это мой DragImage класс, который обрабатывать штрихи:

class DragImages: UIImageView { 

    var originalPos : CGPoint! 
    var dropTarget: UIView? 

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

    required init?(coder aDecoder : NSCoder){ 
     super.init(coder : aDecoder) 
    } 

    override func touchesBegan(_ touches : Set<UITouch>,with event: UIEvent?){ 
     originalPos = self.center 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first{ 
      let position = touch.location(in: self.superview) 
      self.center = CGPoint(x : position.x, y : position.y) 
     } 
    } 

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

     if let touch = touches.first, let target = dropTarget{ 
      let position = touch.location(in: self.superview) 
      if target.frame.contains(position){ 

       NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "onTargetDropped"), object: nil)) 
      }else { 
       self.center = originalPos 
      } 
     } 

     print(self.center.x, self.center.y) 
     self.center = originalPos 
    } 

    func getEndPosX() -> CGFloat{ 
     return self.center.x 
    } 

    func getEndPosY() -> CGFloat { 
     return self.center.y 
    } 

} 

В моем классе ViewController я добавил этот кусок кода для обработки прикосновений и т.д.:

ornament1.dropTarget = xmasTree 
    ornament2.dropTarget = xmasTree 
    ornament3.dropTarget = xmasTree 
    ornament4.dropTarget = xmasTree 

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.itemDroppedOnTree(_:)), name: NSNotification.Name(rawValue: "onTargetDropped"), object: nil) 

} 


func itemDroppedOnTree(_ notif : AnyObject){ 



} 

мне удалось получить X и Y, когда изображение перетаскивается на холст, но я не могу найти способ распознать, какое из 4 изображений отбрасывается, чтобы я мог нарисовать этот конкретный!

+0

Во-первых, не забудьте установить UIImageView.isUserInteractionEnabled() в true (простая ошибка, мы все это делаем). Во-вторых, настройте свойства тегов - они помогут вам узнать, что было затронуто. В третьих? Все выглядит хорошо, но если у вас есть другие проблемы, попробуйте использовать UIGestureRecognizers или отлаживайте текущую настройку. – dfd

+0

ive попытался использовать UIGestureRecognizer, но не повезло. Когда вы сказали свойство тега, насколько я могу использовать это в моем случае? не могли бы вы дать мне пример кода, чтобы вести меня? – pavlos

+1

Используйте делегат для уведомления viewController вместо уведомлений. Функция делегата имеет седер в качестве первого параметра. например 'tableView: tableView cellForRowAt: ...'. Таким образом, вы знаете, какой имидж. В общем, используйте только уведомления для многих трансляций. – shallowThought

ответ

4

Вы можете добавить отправителя в уведомлении (а также положение):

NotificationCenter.default.post(Notification(name: Notification.Name(rawValue: "onTargetDropped"), object: self, userInfo: ["position":position])) 

и получить его позже в itemDroppedOnTree:

func itemDroppedOnTree(_ notif : NSNotification){ 
    let position = notif.userInfo["position"] 
    let sender = notif.object as! DragImage 
    if sender === dragImage1 { 
     //... 
    } else if sender === dragImage2 { 
     //... 
    } 
} 

Я рекомендую против него, хотя и умолять использовать delegate, чтобы сообщить об этом ViewController. (Основано мнение: в основном использовать только уведомления только для трансляций.)

Функция делегата должна иметь отправителя в качестве первого параметра. Согласно func tableView: tableView:UITableView, cellForRowAt indexPath:IndexPath).

Таким образом, вы знаете, какое изображение посылает свое новое положение и может сравнить его с вашей собственности, как в приведенном выше примере:

if dragImage === dragImage1 {... 

Ваш код плюс работает делегат наклеить на Playground:

import UIKit 
import PlaygroundSupport 

protocol DragImageDelegate: class { 
    func dragimage(_ dragImage:DragImage, didDropAt position:CGPoint) 
} 

class DragImage: UIImageView { 
    weak var delegate: DragImageDelegate? 

    var originalPos : CGPoint! 
    var dropTarget: UIView? 

    override init (frame : CGRect) { 
     super.init(frame: frame) 
     isUserInteractionEnabled = true 
    } 

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

    override func touchesBegan(_ touches : Set<UITouch>,with event: UIEvent?){ 
     originalPos = self.center 
    } 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first{ 
      let position = touch.location(in: self.superview) 
      self.center = CGPoint(x : position.x, y : position.y) 
     } 
    } 

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if let touch = touches.first, let target = dropTarget { 
      let position = touch.location(in: self.superview) 
      if target.frame.contains(position){ 
       print(self.center.x, self.center.y) 
       guard let delegate = self.delegate else { 
        print("delegate not set") 
        return 
       } 
       print(self.center.x, self.center.y) 

       delegate.dragimage(self, didDropAt: position) 

       return 
      } 
     } 

     self.center = originalPos 
    } 
} 

class MyVC: UIViewController, DragImageDelegate { 
    let dragImage1 = DragImage(frame: CGRect(x: 0.0, y: 0.0, width: 30.0, height: 30.0)) 
    let dragImage2 = DragImage(frame: CGRect(x: 0.0, y: 100.0, width: 30.0, height: 30.0)) 

    override func viewDidLoad() { 
     let target = UIView(frame: CGRect(x: 200.0, y: 400.0, width: 30.0, height: 30.0)) 
     target.backgroundColor = .black 
     view.addSubview(target) 

     dragImage1.backgroundColor = .white 
     dragImage2.backgroundColor = .white 
     dragImage1.dropTarget = target 
     dragImage2.dropTarget = target 
     view.addSubview(dragImage1) 
     view.addSubview(dragImage2) 

     dragImage1.delegate = self 
     dragImage2.delegate = self 
    } 

    private func move(_ view:UIView, to position:CGPoint) { 
     view.frame = CGRect(x: position.x, y: position.y, width: view.frame.size.width, height: view.frame.size.height) 
    } 

    // MARK: - DragImageDelegate 

    func dragimage(_ dragImage: DragImage, didDropAt position: CGPoint) { 
     if dragImage === dragImage1 { 
      move(dragImage1, to: position) 
     } else if dragImage === dragImage2 { 
      move(dragImage2, to: position) 
     } 
    } 
} 

var container = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0)) 
let myVc = MyVC() 
myVc.view.frame = CGRect(x: 0.0, y: 0.0, width: 300.0, height: 600.0) 
myVc.view.backgroundColor = .green 
container.addSubview(myVc.view) 

PlaygroundPage.current.liveView = container 

Результат:

+0

Это сработало отлично благодаря большому количеству людей .. :) – pavlos

+0

Мое удовольствие. Добро пожаловать. – shallowThought

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