2016-05-08 20 views
5

Bu biraz karmaşık ama umarım birisi bana yardımcı olabilir. OSX uygulamam için bir sürükle ve bırak işlevi oluşturmaya çalışıyorum.Sürükle ve bırak işlevi hızlı OSX

enter image description here

Bu şu anda bakıyor nasıl. Dolayısıyla, kullanıcının görünümü sürükleyip bırakabileceği tek bir metin alanı var. Sadece bir metin alanıyla yeterince basittir, ancak birkaç metin alanı varsa karmaşıklaşıyor ve nasıl yaklaşacağımı bilmiyorum. Bu şu anda ne var:

@IBOutlet weak var test: NSTextField! 

@IBAction override func mouseDragged(theEvent: NSEvent) { 
    NSCursor.closedHandCursor().set() 
    var event_location = theEvent.locationInWindow 

    test.frame.origin.x = event_location.x - 192 
    test.frame.origin.y = event_location.y 
} 

Testi benim NSTextField adıdır. Bunun ismini biliyorum, bu yüzden onu hareket ettirmek kolay. Ancak, kullanıcı daha fazla metin alanı eklerse (sol bölüme bakın), bu ad alanının nasıl yazılacağını bilmiyorum, çünkü onun adı yok (ilk giriş için "test" gibi).

Bu kodu aracılığıyla textfields ekliyorum:

let input = NSTextField(frame: CGRectMake(width, height, 100, 22)) 
    self.MainView.addSubview(input) 

nasıl (görünüm üzerinde birden varsa) seçildi hangi textfield'ı belirlemek ve daha sonra üzerinden sürükle uygun düzgün hareket ve bırak?

sürükle ve bırak ben örnek bir uygulaması hazırladık bu tek statik metin alanına

cevap

4

için çalışan, bu nedenle dikkate bu:

https://github.com/melifaro-/DraggableNSTextFieldSample

fikri NSTextField devralır SelectableTextField tanıtmaktır . SelectableTextField, metin alanı seçim etkinliğinde ilgilenen dinleyicinin aboneliği için tesis sağlar. Bu size kod işleme ayarlamanız gereken didSelectCallback blok değişken vardır. Böyle bir şey: Metin alanı seçili bir kez

textField.didSelectCallback = { (textField) in 
    //this peace of code will be performed once mouse down event 
    //was detected on the text field 
    self.currentTextField = textField 
} 

belirtilen geri arama mekanizması kullanarak, biz currentTextField değişkeninde saklayabilirsiniz.'un mouseDragged fonksiyonu çağrıldığında, currentTextField'un farkındayız ve bunu uygun şekilde halledebiliriz. Örnek uygulama durumunda, sürükleme olay kaydırmasına göre currentTextField kaynağını ayarlamanız gerekir. Umarım şimdi daha iyi oldu.

P.S. Bundan devralmak için NSTextField açıldı, böylece Arabirim Oluşturucu dahil, NSTextField'i kullandığınız her yerde SelectableTextField'ı özgürce kullanabilirsiniz.

senin örnek dışarı kontrol ettikten

DÜZENLEME. Ne yazık ki ben depoya çekme isteği oluşturma/oluşturma yeteneğine sahip değilim, bu yüzden benim önerimi burada bulabilirsiniz:

override func viewDidLoad() { 
    super.viewDidLoad() 

    didButtonSelectCallback = { (button) in 

     if let currentButton = self.currentButton { 

      currentButton.highlighted = !currentButton.highlighted 

      if currentButton == button { 
       self.currentButton = nil 
      } else { 
       self.currentButton = button 
      } 
     } else { 
      self.currentButton = button 
     } 

     button.highlighted = !button.highlighted 
    } 

    addButtonAtRandomePlace() 
    addButtonAtRandomePlace() 

    didButtonSelectCallback(button: addButtonAtRandomePlace()) 
} 

override func mouseDragged(theEvent: NSEvent) { 

    guard let button = currentButton else { 
     return 
    } 

    NSCursor.closedHandCursor().set() 

    button.frame.origin.x += theEvent.deltaX 
    button.frame.origin.y -= theEvent.deltaY 
} 

private func addButtonAtRandomePlace() -> SelectableButton { 

    let viewWidth = self.view.bounds.size.width 
    let viewHeight = self.view.bounds.size.height 

    let x = CGFloat(rand() % Int32((viewWidth - ButtonWidth))) 
    let y = CGFloat(rand() % Int32((viewHeight - ButtonHeight))) 

    let button = SelectableButton(frame: CGRectMake(x, y, ButtonWidth, ButtonHeight)) 
    button.setButtonType(NSButtonType.ToggleButton) 
    button.alignment = NSCenterTextAlignment 
    button.bezelStyle = NSBezelStyle.RoundedBezelStyle 
    button.didSelectCallback = didButtonSelectCallback 
    self.view.addSubview(button) 

    return button 
} 
+0

Mükemmel! Cevabınızı düzenleyebilir ve yaptığınız adımları anlayabilmem için anlatabilir misiniz? NSTextfield için sınıf ve SelectableTextField nasıl çalışır? – Anokrize

+0

Evet, tabi. Yayını günceller. –

+0

Tekrar teşekkürler, her şeyi denedim ve beklendiği gibi çalıştı. Sadece bir sorum var, ayrıca bir düğmeye veya başka nesnelere sürüklenmek zorunda mıyım? Bir düğme ile yapmaya çalıştığım örnek uygulamamı inceleyin.Bana neden çalışmıyor olduğunu söyleyebilir misin? https://github.com/tsafadi/DraggableButton – Anokrize