2017-05-02 42 views
1

我已将ImageView作为子视图添加到Swift中的集合视图中。本子视图的初始点在viewDidLoad()的锚点中进行布置。但是,在视图中点击手势后退出键盘后,ImageView会回到原始位置。我怎么能最好地解决这个问题?如何保持subview,移动平移手势,在辞职键盘后的位置?

import UIKit 

class MessageViewController: UICollectionViewController,UICollectionViewDelegateFlowLayout { 

    let imageButton: UIImageView = { 
     let imageButtonView = UIImageView() 
     imageButtonView.image = UIImage(named: "image.png") 
     imageButtonView.layer.cornerRadius = 30 
     imageButtonView.layer.masksToBounds = true 
     imageButtonView.isUserInteractionEnabled = true 
     return imageButtonView 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //add imageButton 
     view.addSubview(imageButton) 

    //  recognize tapgesture for removing keyboard 
     let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:))) 
     self.view.addGestureRecognizer(tapGesture) 

     let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(gesture:))) 
     imageButton.addGestureRecognizer(panGesture) 
    } 


    func handlePan(gesture: UIPanGestureRecognizer) { 

     let translation = gesture.translation(in: self.view) 
      if let view = gesture.view { 
       view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y) 
    } 
    gesture.setTranslation(CGPoint.zero, in: self.view) 
    } 


    imageButton.translatesAutoresizingMaskIntoConstraints = false 

    imageButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
    imageButton.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 30).isActive = true 
    imageButton.heightAnchor.constraint(equalToConstant: 60).isActive = true 
    imageButton.widthAnchor.constraint(equalToConstant: 60).isActive = true 

} 
+0

请分享一些代码和视觉效果,以帮助我们更好地理解你的问题。 – dmorrow

+0

我添加了一些代码。希望这将有助于回答我的问题。一旦视图被加载,这给我一个在屏幕中间的图像。之后我可以随意拖动它。但是,只有在退出键盘后,图像才会回到原来的位置。 – Bob

回答

0

我认为键盘驳回后,view.setNeedsLayout()被调用,它重置限制到原来的位置。

试试这个只使用约束,没有调整的边界(或中心)

let imageCenterXConstraint:NSLayoutConstraint = NSLayoutConstraint() 
let imageCenterYConstraint:NSLayoutConstraint = NSLayoutConstraint() 

func viewDidLoad() { 
    super.viewDidLoad() 

    //add imageButton 
    view.addSubview(imageButton) 

    //  recognize tapgesture for removing keyboard 
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tap(gesture:))) 
    self.view.addGestureRecognizer(tapGesture) 

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(gesture:))) 
    imageButton.addGestureRecognizer(panGesture) 
    imageButton.translatesAutoresizingMaskIntoConstraints = false 

    imageCenterXConstraint = imageButton.centerXAnchor.constraint(equalTo: view.centerXAnchor) 
    imageCenterXConstraint.isActive = true 
    imageCenterYConstraint = imageButton.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 30) 
    imageCenterYConstraint.isActive = true 
    imageButton.heightAnchor.constraint(equalToConstant: 60).isActive = true 
    imageButton.widthAnchor.constraint(equalToConstant: 60).isActive = true 
} 

func handlePan(gesture: UIPanGestureRecognizer) { 
    let translation = gesture.translation(in: self.view) 
    if let view = gesture.view { 
     imageCenterXConstraint.constant = translation.x 
     imageCenterYConstraint.constant = 30 + translation.y 
     view.layoutIfNeeded() 
    } 
    gesture.setTranslation(CGPoint.zero, in: self.view) 
} 
+0

谢谢你的回答。不幸的是,它不适合我。如果我已经解决了问题,我会努力解决问题。 – Bob