panGesture之后如何固定新的textField位置?

时间:2019-01-12 20:59:43

标签: uipangesturerecognizer

我需要一些有关乱码问题的帮助。 我有一个视图,其中两个textField一个在顶部,另一个在底部,都在imageView上。 我在两个文本字段中都应用了“平移手势”,以允许用户加载图像后更改其位置。 但是,当我显示一个activityView来共享新图像时,textFields返回先前的位置。 panGesture之后,我想将它们修复到新位置。 我能做什么?还是我忘了做什么?

   This is my Pan Gesture Action
@IBAction func didPanTfTop(_ sender: UIPanGestureRecognizer) {

    let translation = sender.translation(in: self.view)

    if sender.state == .began {
        print("Gesture began")
        textFieldOriginalCenter = tfTop.center
    } else if sender.state == .changed {
        print("Gesture is changed")
        tfTop.center = CGPoint(x: textFieldOriginalCenter.x + translation.x, y: textFieldOriginalCenter.y + translation.y)
    } else if sender.state == .ended {
        print("Gesture ended")

    }
}

这是我的activityView方法...

@IBAction func share(_ sender: UIBarButtonItem) {
    Feedback.share.hapticFeedback()
    let memeImage = generateMemedImage()
    let activityView = UIActivityViewController(activityItems: [memeImage], applicationActivities: nil)
    activityView.completionWithItemsHandler = { (activityType: UIActivity.ActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) -> Void in

        if completed {
            self.save()
            print("Image has saved")
        }
    }
    present(activityView, animated: true, completion: nil)
}

1 个答案:

答案 0 :(得分:1)

通常,看到视图返回到其原始位置的这种行为是由于(a)使用自动布局约束而产生的; (b)做一些触发约束的事情。有时,最无害的UI动作可能会触发重新应用约束的过程。最重要的是,不必担心是什么触发了重新应用约束,最好是即使在这种情况发生之后,也要确保您的视图将保持在您希望的位置。

一种解决方案是更新视图的transform而不是center,例如:

var originalTransform: CGAffineTransform!

@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
    switch gesture.state {
    case .began:
        originalTransform = gesture.view!.transform

    case .changed, .ended:
        let translation = gesture.translation(in: gesture.view)
        gesture.view?.transform = originalTransform.translatedBy(x: translation.x, y: translation.y)

    default:
        break
    }
}

此技术有效,但也感觉有些脆弱,这取决于约束和视图转换之间记录不良的行为。

另一种更强大但更复杂的方法是调整约束的constant属性。例如,您可以为约束本身创建@IBOutlet引用,在IB中连接这些插座,然后手势识别器可以相应地更新其constant属性:

@IBOutlet weak var horizontalConstraint: NSLayoutConstraint!
@IBOutlet weak var verticalConstraint: NSLayoutConstraint!

private var originalHorizontalConstant: CGFloat!
private var originalVerticalConstant: CGFloat!

@IBAction func handlePan(_ gesture: UIPanGestureRecognizer) {
    switch gesture.state {
    case .began:
        originalHorizontalConstant = horizontalConstraint.constant
        originalVerticalConstant = verticalConstraint.constant

    case .changed, .ended:
        let translation = gesture.translation(in: gesture.view)
        horizontalConstraint.constant = originalHorizontalConstant + translation.x
        verticalConstraint.constant = originalVerticalConstant + translation.y

    default:
        break
    }
}

现在,很明显,如果您有可能在此周围拖动不同的视图,可能会有点混乱,但是希望以上内容可以说明基本思想。

无论采用哪种技术,基本概念都是避免更新其位置由自动布局约束决定的视图的centerframe