How to display UIView over keyboard in iOS

前端 未结 7 911
醉话见心
醉话见心 2020-12-05 20:04

I want to create a simple view over keyboard, when users tap \"Attach\" button in inputAccessoryView. Something like this:

Is there an easy way to do it? O

相关标签:
7条回答
  • 2020-12-05 20:24

    Swift 4 version:

    let customView = UIView(frame: CGRect(x: 0, y: self.view.frame.size.height - 300, width: self.view.frame.size.width, height: 300))
    customView.backgroundColor = UIColor.red
    customView.layer.zPosition = CGFloat(Float.greatestFiniteMagnitude)
    UIApplication.shared.windows.last?.addSubview(customView)
    

    The trick is to add the customView as a top subview to the UIWindow that holds the keyboard - and it happens to be the last window in UIApplication.shared.windows.

    0 讨论(0)
  • 2020-12-05 20:25

    As Tamás Sengel said, Apple's guidelines does not support adding a view over the keyboard. The recommended way to add a view over keyboard in Swift 4 & 5 is:

    1) Add view with your "Next" button in your storyboard as external view and connect in your class (see Explain Image), in my case:

    IBOutlet private weak var toolBar: UIView!
    

    2) For the textfield you want to add your custom view over keyboard, add it as accessory view in viewDidLoad:

    override func viewDidLoad() {
        super.viewDidLoad()
        phoneNumberTextField.inputAccessoryView = toolBar
    }
    

    3) Add action for "Next" button:

    @IBAction func nextButtonPressed(_ sender: Any) {
        descriptionTextView.becomeFirstResponder()
    
        // or -> phoneNumberTextField.resignFirstResponder()
    }
    

    Explain Image:

    Method 2: Result with image

    In TableView Controller - add stricked view at bottom

    Please follow this great link to handle safe area for screens like iPhone X if you want to use this method(2). Article: InputAccessoryView and iPhone X

    override var inputAccessoryView: UIView? {
        return toolBar
    }
    
    override var canBecomeFirstResponder: Bool {
        return true
    }
    
    0 讨论(0)
  • 2020-12-05 20:25

    While this can be possible with accessing the topmost window, I would avoid doing this, as it clearly interferes with Apple's guidelines.

    What I would do is dismissing the keyboard and replacing its frame with a view with same dimensions.

    The keyboard's frame can be accessed from keyboard notifications listed here, their userInfo contain a key that can be accessed with UIKeyboardFrameEndUserInfoKey.

    0 讨论(0)
  • 2020-12-05 20:30

    Swift 4.0

    let customView = UIView(frame: CGRect(x: 0, y: self.view.frame.size.height-300, width: self.view.frame.size.width, height: 300))
    customView.backgroundColor = UIColor.red
    customView.layer.zPosition = CGFloat(MAXFLOAT)
    let windowCount = UIApplication.shared.windows.count
    UIApplication.shared.windows[windowCount-1].addSubview(customView)
    
    0 讨论(0)
  • 2020-12-05 20:34

    Do you have find some effective method to solve this problem? In iOS9,you put your customView on the top of the windows:

    UIApplication.sharedApplication().windows[windowCount-1].addSubview(customView);
    

    But if the keyboard dismisses, the top Windows will be removed, so your customView will be removed. Looking forward for your help! Thank you for your help!

    0 讨论(0)
  • 2020-12-05 20:43

    You can definitely add the view to your application’s window, and you can also add another window entirely. You can set its frame and level. The level could be UIWindowLevelAlert.

    0 讨论(0)
提交回复
热议问题