簡體   English   中英

鍵盤解除后,將inputAccessoryView保持可見狀態

[英]Leaving inputAccessoryView visible after keyboard is dismissed

我想要做的是在iPad上的Safari中創建類似於“在頁面上查找”搜索功能的東西。

我正在使用帶有一些項目的UIToolbar ,並通過在UITextField inputAccessoryView其設置為inputAccessoryView將其附加到鍵盤。 像魅力一樣,但有一件事我無法弄清楚。 在Safari中,當您搜索某些內容時,鍵盤會消失,但工具欄仍保留在屏幕底部。

有沒有人知道如何做到這一點? 我能想到的唯一解決方案是響應鍵盤解除事件,然后拉出UIToolBar並創建一個自定義動畫,將其移動到屏幕底部。 但這很黑。 我正在尋找一個更優雅的解決方案。 當鍵盤被解除時,可以讓我決定如何處理輸入附件視圖。

它是這樣完成的:

將UIToolbar分配給視圖控制器中的屬性:

@property (strong, nonatomic) UIToolbar *inputAccessoryToolbar;

在頂視圖控制器中,添加以下方法:

- (BOOL)canBecomeFirstResponder{

    return YES;

}

- (UIView *)inputAccessoryView{

    return self.inputAccessoryToolbar;

}

然后(可選地,通常不需要),只要鍵盤被隱藏,只需調用:

[self becomeFirstResponder];

這樣,您的inputAccessoryToolbar將是您的視圖控制器和文本視圖的輸入附件視圖。

我已經結束了與UIToolBar未被指定為輸入附件視圖,並上下滑動的UIKeyboardWillShowNotification / UIKeyboardWillHideNotification

添加到@ arik的答案,這是Swift版本:

class ViewController: UIViewController {

  @IBOutlet var textField: UITextField!      

  // Input Accessory View
  private var inputAccessoryToolbar: UIToolBar?
  override func canBecomeFirstResponder() -> Bool {
    return true
  }
  override var inputAccessoryView: UIView? {
    return inputAccessoryToolbar
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    inputAccessoryToolbar = UIToolbar(frame: CGRectMake(0, 0, view.frame.size.width, 50))
    textField.inputAccessoryView = inputAccessoryToolbar
  }

  // UITextFieldDelegate
  func textFieldShouldReturn(textField: UITextField) -> Bool {
    becomeFirstResponder()
    return true
  }
}

謝謝你的清潔解決方案!

根據之前的答案更新到Swift 4。 如果您通過故事板添加工具欄,則可以執行此操作

class ViewController: UIViewController {

    @IBOutlet weak var textField: UITextField!
    @IBOutlet var toolbar: UIToolbar!

    override var canBecomeFirstResponder: Bool {
        get {
            return true
        }
    }

    override var inputAccessoryView: UIView {
        get {
            return self.toolbar
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        textField.inputAccessoryView = toolbar
    }
}

在這種情況下,每當文本字段辭職第一響應者時,它默認第一響應者到主視圖。 請記住,如果有多個UI元素,並且第一個響應者在辭職后默認為不需要的視圖,則您可能希望顯式重新簽署第一個響應者,並將主視圖設置為第一響應者。

您可能還需要使用inputAccessoryView來處理錯誤,而不考慮安全區域邊距,從而無法為iPhone X上的家庭指示器事物騰出空間: iPhone X如何處理View Controller inputAccessoryView?

我找到了最簡單的解決方案,當你有一個來自xib的UIToolbar並且你也使用那個UIToolbar作為文本字段的inputAccessoryView時,當你從被覆蓋的inputAccessoryView返回它時,將工具欄嵌入到UIView中,並使得包含的UIView更高由safeAreaInsets.bottom。 (其他解決方案建議將工具欄的底部約束到子類中的安全區域,但這會導致約束沖突,並且還意味着工具欄下的區域是錯誤的顏色。)但是,您還必須記住文本即使屏幕上沒有鍵盤(例如,如果有外部鍵盤),字段也可以具有焦點,因此在這種情況下,您需要將文本視圖的inputAccessoryView更改為此工具欄內的UIView。 實際上,只需總是使用包含視圖並適當調整其大小,這可能會使事情變得更簡單。 無論如何,這是我對inputAccessoryView的重寫:

    override var inputAccessoryView: UIView? {

    if toolbarContainerView == nil {

        let frame=CGRect(x: toolBar.frame.minX, y: toolBar.frame.minY, width: toolbar.frame.width, height: toolBar.frame.height+view.safeAreaInsets.bottom)

        toolbarContainerView = UIView(frame: frame)

    }

    if (toolbar.superview != toolbarContainerView) {

        //this is set to false when the toolbar is used above the keyboard without the container view

        //we need to set it to true again or else the toolbar will appear at the very top of the window instead of the bottom if the keyboard has previously been shown.

        toolbar.translatesAutoresizingMaskIntoConstraints=true

        toolbarContainerView?.addSubview(toolbar)

    }

    return toolbarContainerView

}

在這種情況下,覆蓋viewSafeAreaInsetsDidChange以調整toolbarContainerView的大小可能是個好主意。

暫無
暫無

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

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