2016-11-10 20 views
0

私はそのイメージに1つのイメージビューとテキストフィールドを持っています。テキストフィールドを下のコードでドラッグ可能にしますが、画面のどこにでもドラッグ可能にすることができます。私は、そのテキストフィールドは、画像ビューの限界でのみドラッグ可能にしたい。 draagedView関数をチェックインするとコメントアウトすると、x値が同じになるので、textfieldはimageviewの左側に止まります。Swiftのドラッグ可能なアイテムへの制限を設定します

私はこの解決策を見つけましたが、私のプロジェクトでうまく動作するように修正することはできません。 Use UIPanGestureRecognizer to drag UIView inside limited area

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:))) 
    bottomTextField.addGestureRecognizer(gesture) 
    bottomTextField.isUserInteractionEnabled = true 
} 
    func userDragged(gesture: UIPanGestureRecognizer){ 
    let loc = gesture.location(in: self.view) 
    self.bottomTextField.center = loc 
} 
func draggedView(_ sender:UIPanGestureRecognizer) { 
    let compare = MyimageView.frame.maxX <= bottomTextField.frame.maxX 
    //if(MyimageView.frame.minX <= bottomTextField.frame.minX && compare) 
    // { 
    self.view.bringSubview(toFront: sender.view!) 
    let translation = sender.translation(in: self.view) 
    sender.view!.center = CGPoint(x: sender.view!.center.x + translation.x, y: sender.view!.center.y + translation.y) 
    sender.setTranslation(CGPoint.zero, in: self.view) 

    // } 
} 

答えて

0

主な問題は、あなたが翻訳を行う前に位置をチェックしているということです。つまり、テキストフィールドは無効な位置になり、そのあとブロックifに到達することはありません。

これは問題にアプローチする少し異なる方法で、テキストフィールドが右限界の端に達したことを意味します

func draggedView(_ sender: UIPanGestureRecognizer) { 

    guard let senderView = sender.view else { 
    return 
    } 

    var translation = sender.translation(in: view) 

    translation.x = max(translation.x, MyimageView.frame.minX - bottomTextField.frame.minX) 
    translation.x = min(translation.x, MyimageView.frame.maxX - bottomTextField.frame.maxX) 

    translation.y = max(translation.y, MyimageView.frame.minY - bottomTextField.frame.minY) 
    translation.y = min(translation.y, MyimageView.frame.maxY - bottomTextField.frame.maxY) 

    senderView.center = CGPoint(x: senderView.center.x + translation.x, y: senderView.center.y + translation.y) 
    sender.setTranslation(.zero, in: view) 
    view.bringSubview(toFront: senderView) 
} 

私もでguardステートメントを追加することによって、それが少しより安全になりましたアンラップ力の上部を取り除きます。

+0

テキストフィールドの位置を変更して変更すると、テキストフィールドがイメージビューの中央に再び移動します。私はその場所にとどまることを望みます。それをどうすれば解決できますか?ありがとうございました! –

+0

翻訳をオーバーライドする自動レイアウト制約があります。私はこれを新しい疑問として提起するでしょう。 – ganzogo

関連する問題