ResignFirstResponder doesn't animate keyboard dismissal on iOS26

I find that using resignFirstResponder doesn't animate keyboard dismissal.

I wonder why, any ideas?

Here's a simple example:

import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    
    let textField = UITextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let button = UIButton(type: .system)
        button.setTitle("Dismiss", for: .normal)
        button.addTarget(self, action: #selector(pressed), for: .touchUpInside)
        button.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(button)
        view.addConstraints([
            .init(item: button, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0),
            .init(item: button, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1, constant: 100),
        ])

        textField.backgroundColor = .gray
        textField.delegate = self
        textField.placeholder = "Type here"
        textField.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(textField)
        view.addConstraints([
            .init(item: textField, attribute: .centerX, relatedBy: .equal, toItem: view, attribute: .centerX, multiplier: 1, constant: 0),
            .init(item: textField, attribute: .top, relatedBy: .equal, toItem: button, attribute: .top, multiplier: 1, constant: 100),
            .init(item: textField, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 200),
            .init(item: textField, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50),
        ])
    }
    
    @objc private func pressed() {
        textField.resignFirstResponder()
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

Which resign ? Line 34 or 38 ?

On device or in simulator ?

Could you add a log in both cases to check which is called ?

I tested on simulators for iOS 18 and 26.0.

  • In both cases, dismiss is called and hides keyboard
  • shouldReturn is called in both cases when typing Return on keyboard

You can either press the button, or press the return key on the keyboard. In both cases the keyboard abruptly disappears on both the simulator and iPhone 17 pro.

Here's a video from the simulator: https://www.dropbox.com/scl/fi/8qc7is8iqpcjigta71qbq/keyboarddismissal.mov?rlkey=ftgnuoiu4x6mc8qokh5xw22b1&st=bpqb26b8&dl=0

I see others reporting similar issues here: https://github.com/facebook/react-native/issues/53626

OK, noticed the difference in animation / no animation between the 2 OS versions.

Is it a constraint due to liquid glass (would be bad news).

Did you file a bug report, at least against documentation if that's on purpose ? Please note reference here.

Thanks for the reply, yes Radar filed with ID: FB20611108

ResignFirstResponder doesn't animate keyboard dismissal on iOS26
 
 
Q