簡體   English   中英

當鍵盤出現Swift時發出移動視圖

[英]Issue moving view when keyboard appears Swift

我使用滾動視圖和自動布局在鍵盤出現並隱藏我的文本輸入元素之一時移動視圖。 為此,我正在使用以下功能。

問題是我無法同時在文本字段和文本視圖中使用它。 我進行了很多研究,並嘗試實現在SO和其他資源上找到的所有答案,但是大多數答案只處理單個文本字段而不是多個文本字段,並且我還沒有找到針對文本字段和文本視圖的單一解決方案。

我知道下面的代碼是為文本字段設計的,但是我也試圖對其進行修改以使其與文本視圖一起使用,因為在鍵盤出現時,我已經看到了各種不同的移動視圖的方式,這對我來說是最好的。

我想知道是否有一種方法可以使用當前代碼為我的文本字段和文本視圖移動視圖。 我也想知道這是否是移動視圖的最佳方法。

出現鍵盤時移動視圖的功能:

func keyboardWillShow(sender: NSNotification) {
    let info: NSDictionary = sender.userInfo!
    let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue
    let keyboardSize: CGSize = value.CGRectValue().size
    let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 20, 0.0)
    scrollView.contentInset = contentInsets

    var aRect: CGRect = self.view.frame
    aRect.size.height -= keyboardSize.height
    let activeTextFieldRect: CGRect? = myTextField?.frame
    let activeTextFieldOrigin: CGPoint? = activeTextFieldRect?.origin
    if (!CGRectContainsPoint(aRect, activeTextFieldOrigin!)) {
        scrollView.scrollRectToVisible(activeTextFieldRect!, animated:true)
    }
}

func keyboardWillHide(sender: NSNotification) {
    let contentInsets: UIEdgeInsets = UIEdgeInsetsZero
    scrollView.contentInset = contentInsets
}

func textFieldDidBeginEditing(textField: UITextField) {
    myTextField = textField
    scrollView.scrollEnabled = true
}

func textFieldDidEndEditing(textField: UITextField) {
    myTextField = nil
    scrollView.scrollEnabled = true
} 

我曾嘗試推行textViewDidBeginEditingtextViewDidEndEditing ,然后分配到位的myTextView在這一行: let activeTextFieldRect: CGRect? = myTextField?.frame let activeTextFieldRect: CGRect? = myTextField?.frame但這似乎是一種草率的方式,因此無法正常工作。 任何幫助深表感謝。

第一步是確定當前第一響應者的文本字段或文本視圖。 可以使用textField和textView委托正確地確定第一響應者,也可以遍歷所有文本字段和文本視圖以執行以下操作以查看哪個是第一響應者:

func activeItemRect() -> CGRect? {
        for textField in textFields {
            if textField.isFirstResponder() { return textField.frame }
        }
        for textView in textViews{
            if textView.isFirstResponder() { return textView.frame }
        }
        return nil
    }

第二步是確定當前項目是否在視圖的可見部分中。 您可以通過檢查所選項目的原點是否在視圖的可見區域內來進行此操作。 您應該檢查所選項目的中心或底部,而不是其原點,因為有時原點會在可見視圖rect中,但被顯示在鍵盤頂部的iOS文本輸入建議面板隱藏。

在用於測試您的方案的完整代碼下面發布:

class ViewController: UIViewController {

    @IBOutlet var textFields: [UITextField]!
    @IBOutlet var textViews: [UITextView]!
    @IBOutlet weak var scrollView: UIScrollView!

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for textField in textFields { textField.resignFirstResponder() }
        for textView in textViews{ textView.resignFirstResponder() }
    }

    func activeItemRect() -> CGRect? {
        for textField in textFields {
            if textField.isFirstResponder() { return textField.frame }
        }
        for textView in textViews{
            if textView.isFirstResponder() { return textView.frame }
        }
        return nil
    }

    func keyboardWillShow(sender: NSNotification) {
        let info: NSDictionary = sender.userInfo!
        let value: NSValue = info.valueForKey(UIKeyboardFrameBeginUserInfoKey) as! NSValue
        let keyboardSize: CGSize = value.CGRectValue().size
        let contentInsets: UIEdgeInsets = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height + 20, 0.0)
        scrollView.contentInset = contentInsets

        var aRect: CGRect = self.view.frame
        aRect.size.height -= keyboardSize.height
        let activeTextFieldRect: CGRect? = activeItemRect()
        let activeTextFieldCentre: CGPoint? = CGPointMake(CGRectGetMidX(activeTextFieldRect!), CGRectGetMidY(activeTextFieldRect!))
        if (!CGRectContainsPoint(aRect, activeTextFieldCentre!)) {
            scrollView.scrollRectToVisible(activeTextFieldRect!, animated:true)
        }
    }

    func keyboardWillHide(sender: NSNotification) {
        let contentInsets: UIEdgeInsets = UIEdgeInsetsZero
        scrollView.contentInset = contentInsets
    }

}

首先,我為所有文本字段創建了一個IBOutletCollection。 然后,我為所有文本視圖創建了一個IBoutletCollection。 然后創建的方法將遍歷所有textFields和textViews並返回活動項目的框架。

其余代碼與您正在執行的操作相似90%。 唯一的區別是,不是檢查所選項目的原點是否位於視圖的可見部分內,而是檢查所選項目的中心是否位於視圖的可見部分內。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM