2016-12-07 2 views
0

ドラッグ可能なラベルをたくさん用意し、これを実現するために次のコードを書いています。しかし、これはそれを行うにはかなり愚かな方法です...私はすべてのオブジェクトの関数を書くので。ただ1つの関数を使って同じ効果を達成できる方法はありますか?複数のドラッグ可能なビューをプログラムで作成する最善の方法はありますか?

override func viewDidLoad() { 
     super.viewDidLoad() 

     let label = UILabel(frame: CGRectMake(UIScreen.mainScreen().bounds.width/2 - 100, UIScreen.mainScreen().bounds.height/2 - 100, 100, 50)) 
     let label2 = UILabel(frame: CGRectMake(UIScreen.mainScreen().bounds.width/2 - 100, UIScreen.mainScreen().bounds.height/2 - 200, 100, 50)) 

     label.text = "Str" 
     label.textAlignment = NSTextAlignment.Center 
     label.backgroundColor = UIColor.greenColor() 
     self.view.addSubview(label) 

     label2.text = "ing" 
     label2.textAlignment = NSTextAlignment.Center 
     label2.backgroundColor = UIColor.greenColor() 
     self.view.addSubview(label2) 



     let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:")) 
     label.addGestureRecognizer(gesture) 
     label.userInteractionEnabled = true 

     let gesture2 = UIPanGestureRecognizer(target: self, action: Selector("wasDragged1:")) 
     label2.addGestureRecognizer(gesture2) 
     label2.userInteractionEnabled = true 



    } 

    func wasDragged(gesture: UIPanGestureRecognizer) { 
     let translation = gesture.translationInView(self.view) 
     if let label = gesture.view { 

     label.center = CGPoint(x: label.center.x + translation.x, y: label.center.y + translation.y) 

     } 
     gesture.setTranslation(CGPointZero, inView: self.view) 


    } 

    func wasDragged1(gesture:UIPanGestureRecognizer) { 

     let translation = gesture.translationInView(self.view) 
     if let label = gesture.view { 

      label.center = CGPoint(x: label.center.x + translation.x, y: label.center.y + translation.y) 

     } 
     gesture.setTranslation(CGPointZero, inView: self.view) 



    } 
+0

UILabelをサブクラス化し、そのジェスチャーを行います。 –

答えて

1

DRYの原則を維持するための良い仕事! UILabelUIViewのとあなたが同様に望んでいた場合は、後でUIViewをドラッグすることができますので、サブクラスであるので、 - 私はどうなるのか

UIViewに制限されてDraggable呼ばプロトコルを作るです。

protocol Draggable where Self: UIView {} 

その後、私はそのようなUIPanGestureを設定し、そのwasDraggedコールバックを処理する等の方法が含まれていDraggableプロトコルの拡張になるだろう。

extension Draggable { 
    // Implement things to make the view draggable 
} 

その後、私はDraggableプロトコルを実装CustomLabelUILabelをサブクラス化します。ここで

class CustomLabel : UILabel, Draggable { 
    // Customize your label here 
} 

、あなたは簡単にそれがドラッグ可能だと、このカスタムラベルは、最も重要なのUILabelのサブクラスであるとことを見ることができます!

+0

ありがとうございます。しかし、上記のコードでプロトコルを作成しようとすると、多くのエラーが発生します。 –

+0

@ZachLどのようなエラーが表示されますか? –

+0

私は3つのエラーがあります:ステートメントはクロージャー式で始めることはできません。プロトコルタイプで "{"が必要です。ブレースされたステートメントブロックは未使用のクロージャーです。 –

0
extension UILabel { 
    convenience init(
     text:String, 
     textAlignment:NSTextAlignment, 
     backgroundColor:UIColor, 
     target:Any, 
     action:Selector 
    ) 
{ 
    self.init(frame:CGRect.zero) 
    self.text = text 
    self.textAlignment = textAlignment 
    self.backgroundColor = backgroundColor 
    if target != nil && action != nil { 
     let gesture = UIPanGestureRecognizer(target: target, action: #selector(action)) 
     self.addGestureRecognizer(gesture) 
    } 
} 

この拡張は、UILabelまたはUIViewのいずれか最適な方法で行うことができます。必要に応じてこの便利なイニシャライザを作成し、必要に応じて他のものを追加することができます。 (初期フレームをCGRect.zeroではなくYMMVに設定することをお勧めします)

関連する問題