UIView在用户交互后消失

时间:2016-11-12 17:24:54

标签: ios iphone swift uiview

每当我点击视图中的文本字段,然后单击其他文本字段时,视图就会消失。奇怪......任何人都可以帮忙吗?

It's the view in the middle.

我使用facebook pop为视图设置动画。这是我的动画引擎代码: 导入UIKit 导入pop

class AnimationEngine {

    class var offScreenRightPosition: CGPoint {
        return CGPoint(x: UIScreen.main.bounds.width + 250,y: UIScreen.main.bounds.midY - 75)
    }

    class var offScreenLeftPosition: CGPoint{
        return CGPoint(x: -UIScreen.main.bounds.width,y: UIScreen.main.bounds.midY - 75)
    }

    class var offScreenTopPosition: CGPoint{
        return CGPoint(x: UIScreen.main.bounds.midX,y: -UIScreen.main.bounds.midY)
    }

    class var screenCenterPosition: CGPoint {
        return CGPoint(x: UIScreen.main.bounds.midX, y: UIScreen.main.bounds.midY - 75)
    }

    let ANIM_DELAY : Int = 1
    var originalConstants = [CGFloat]()
    var constraints: [NSLayoutConstraint]!

    init(constraints: [NSLayoutConstraint]) {

        for con in constraints {
            originalConstants.append(con.constant)
            con.constant = AnimationEngine.offScreenRightPosition.x
        }

        self.constraints = constraints
    }

    func animateOnScreen(_ delay: Int) {

        let time = DispatchTime.now() + Double(Int64(Double(delay) * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC)

        DispatchQueue.main.asyncAfter(deadline: time) {

            var index = 0
            repeat {
                let moveAnim = POPSpringAnimation(propertyNamed: kPOPLayoutConstraintConstant)
                moveAnim?.toValue = self.originalConstants[index]
                moveAnim?.springBounciness = 8
                moveAnim?.springSpeed = 8

                if (index < 0) {
                    moveAnim?.dynamicsFriction += 10 + CGFloat(index)
                }

                let con = self.constraints[index]
                con.pop_add(moveAnim, forKey: "moveOnScreen")

                index += 1

            } while (index < self.constraints.count)
        }

    }

    class func animateToPosisition(_ view: UIView, position: CGPoint, completion: ((POPAnimation?, Bool) -> Void)!) {
        let moveAnim = POPSpringAnimation(propertyNamed: kPOPLayerPosition)
        moveAnim?.toValue = NSValue(cgPoint: position)
        moveAnim?.springBounciness = 8
        moveAnim?.springSpeed = 8
        moveAnim?.completionBlock = completion
        view.pop_add(moveAnim, forKey: "moveToPosition")
    }
}

然后这是我的viewcontroller代码,其中视图位于:

import UIKit
import pop


class LoginVC: UIViewController, UITextFieldDelegate {

    override var prefersStatusBarHidden: Bool {
        return true
    }

    @IBOutlet weak var emailLoginVCViewConstraint: NSLayoutConstraint!
    @IBOutlet weak var emailLoginVCView: MaterialView!
    @IBOutlet weak var emailAddressTextField: TextFieldExtension!
    @IBOutlet weak var passwordTextField: TextFieldExtension!

    var animEngine : AnimationEngine!

    override func viewDidAppear(_ animated: Bool) {
        self.emailLoginVCView.isUserInteractionEnabled = true
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        self.view.bringSubview(toFront: emailAddressTextField)
        self.animEngine = AnimationEngine(constraints: [emailLoginVCViewConstraint])
        self.emailAddressTextField.delegate = self
        self.passwordTextField.delegate = self
        emailAddressTextField.allowsEditingTextAttributes = false
    }


    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if (textField === emailAddressTextField) {
            passwordTextField.becomeFirstResponder()
        } else if (textField === passwordTextField) {
            passwordTextField.resignFirstResponder()
        } else {
            // etc
        }

        return true
    }

    @IBAction func emailTapped(_ sender: AnyObject) {
        AnimationEngine.animateToPosisition(emailLoginVCView, position: AnimationEngine.screenCenterPosition, completion: { (POPAnimation, Bool)
            in
        })
    }

    @IBAction func exitTapped(_ sender: AnyObject) {
        AnimationEngine.animateToPosisition(emailLoginVCView, position: AnimationEngine.offScreenRightPosition, completion: { (POPAnimation, Bool)
            in
        })
    }

}

最后这里是我的hierchy和选项:(我的观点的名称是emailLoginVCView)。另外当我点击另一个文本字段进行调试时,我设置了一个断点,所以我得到了这个信息:enter image description here

enter image description here enter image description here

1 个答案:

答案 0 :(得分:0)

  1. 我有一个约束,将登录视图的中心与主屏幕的中心绑定

  2. 当我创建AnimationEngine时,我传递了该约束,并将其image: node:4.2.2设置为constant

  3. 当我打开电子邮件登录表时,我没有改变约束的常量;我只是改变了视图的位置

  4. 这意味着autolayout认为它应该仍然在屏幕外

  5. 当第二个文本字段变为活动状态时,它会以某种方式触发自动布局以重新评估约束,并且它看到登录视图的位置与约束所说的位置不匹配应该如此....

  6. Autolayout将其移至屏幕外

  7. 因此,如果我在offScreenRightPosition.x中添加此内容,问题就会消失:)

    emailTapped(_:)