2016-12-08 15 views
5

Nasıl duygulandım hangi görüntüyü tanımak.Ben kullanıcı sürüklemek ve bir tuval üzerinde damla öğeleri ve o görüntüyü serbest bıraktığında o tuval üzerine çizilir mümkün olacak bir uygulama geliştiriyorum

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){ 



} 

Ben X'i başardı: Ben dokunuşlar vb işlemek için kod parçası eklendi benim ViewController sınıfta

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 
    } 

} 

:

Bu

dokunuşlar aitlisteler dragImage sınıftır ve görüntü tuval üzerine sürüklenmekte ama bana o belirli çizmek için sırayla bırakılıyor 4 görüntülerin hangi tanımak için bir yol bulmak olamaz Y konumu!

Sen bildirim (ve ayrıca konum) göndermesini ekleyebilir
+0

İlk olarak, UIImageView.isUserInteractionEnabled() öğesini true olarak ayarlamayı unutmayın (hepimiz hata yaparız). İkincisi, etiket özelliklerini kurun - hangi dokunulduğunu bilmenize yardımcı olurlar. Üçüncü? İşler iyi görünüyor, ancak başka sorunlarınız varsa, UIGestureRecognizers'ı kullanmayı deneyin veya mevcut ayarlarınızı hata ayıklamaya çalışın. – dfd

+0

ive UIGestureRecognizer ama hiç şans kullanarak çalıştı. Etiket mülkünü söylediğinde benim durumumda bunu ne kadar da kullanabildim? Bana rehberlik etmem için bana bir örnek kod verebilir misin? – pavlos

+1

Bildirimler yerine viewController'ı bilgilendirmek için bir temsilci kullanın. Temsilci işlevi, ilk parametre olarak ekiciye sahiptir. 'tableView: tableView cellForRowAt: ... 'gibi. Bu şekilde hangi resmin olduğunu biliyorsunuz. Genel olarak, sadece birçok yayın için Bildirimleri kullanın. – shallowThought

cevap

4

:

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

ve itemDroppedOnTree içinde daha sonra alıyorum:

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

buna karşı tavsiye olsa ve savunmak yerine ViewController bilgilendirmek için bir delegate kullanmak. (Görüş göre Genel olarak,-çok yayın yalnızca bildirimleri kullanın.)

temsilci fonksiyonu ilk parametre olarak gönderen sahip olmalıdır. func tableView: tableView:UITableView, cellForRowAt indexPath:IndexPath)'a göre.

onun yeni konumunu gönderiyor ve yukarıdaki örnekte olduğu gibi Mülkünüze karşılaştırabilirsiniz hangi resim biliyorum Bu şekilde:

if dragImage === dragImage1 {... 

Sizin kod artı Playground yapıştırmak için temsilci çalışma:

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 

Sonuç:

+0

Bu, mükemmel bir şekilde çok çalıştı çünkü çok teşekkürler .. :) – pavlos

+0

Benim için zevk. Hoşgeldiniz. – shallowThought

İlgili konular