inputAccessoryView 在 alertController (actionSheet) 出现时动画化
inputAccessoryView animating down when alertController (actionSheet) presented
我有一个聊天应用程序的 inputAccessoryView,它始终保持可见并停靠在屏幕底部以进行文本输入,类似于大多数消息传递应用程序。
当我呈现一个具有 actionSheet 样式的 alertController 时,inputAccessoryView 在呈现警报时在屏幕外进行动画处理,然后在解除警报时再次备份。这反过来滚动我的 tableView 并且是不可取的。
发生这种情况是因为聊天 viewController 在出现警报时放弃了 firstResponder。
是否可以呈现一个 alertController 并且不放弃 firstResponder,或者无论如何在它的视图 resignsFirstResponder 时保持 inputAccessoryView 停靠在屏幕底部?
InputAccessoryView
位于 ViewController 的层次结构之外 - 它包含在 UITextEffectsWindow
中,其根 ViewController 是 UIInputWindowController
。同样,键盘包含在 UIRemoteKeyboardWindow
及其自己的 UIInputWindowController
.
中
因此,如果我们从最高 window 或更高级别(UITextEffectsWindow
或 UIRemoteKeyboardWindow
)显示警报,它不会辞去第一响应者。
我找到的最简单的解决方案是:
let topViewController = UIApplication.shared.windows.last!.rootViewController!
topViewController.present(alert, animated: true, completion: nil)
理想情况下,您可以安全地处理这些可选值。一个可能更好的解决方案(我从以前的解决方案中看到了一些控制台错误)是创建一个具有更高 WindowLevel 的新 UIWindow,使其成为键 window 并且可见,并从那里显示警报。
对于那些寻找 Objective-C 相当于 Corey 答案的人:
UIViewController *objViewController = [UIApplication sharedApplication].windows.lastObject.rootViewController;
[objViewController presentViewController:view animated:YES completion:nil];
感谢@Corey W.(给他投票)我们有了解决这个问题的方法。 Swift 5:
中更安全的方法
// Instantiate AlertController
let actionSheet = UIAlertController(title: title,
message: "Comment options",
preferredStyle: .actionSheet)
// Add actions
actionSheet.addAction(UIAlertAction(title: "Edit",
style: .default,
handler: { (_: UIAlertAction) in
self.showEditingView(withCommentId: commentId, withCommentText: commentText)
}))
// Present AlertController
if let lastApplicationWindow = UIApplication.shared.windows.last,
let rootViewController = lastApplicationWindow.rootViewController {
rootViewController.present(actionSheet, animated: true, completion: nil)
}
我有一个聊天应用程序的 inputAccessoryView,它始终保持可见并停靠在屏幕底部以进行文本输入,类似于大多数消息传递应用程序。
当我呈现一个具有 actionSheet 样式的 alertController 时,inputAccessoryView 在呈现警报时在屏幕外进行动画处理,然后在解除警报时再次备份。这反过来滚动我的 tableView 并且是不可取的。
发生这种情况是因为聊天 viewController 在出现警报时放弃了 firstResponder。
是否可以呈现一个 alertController 并且不放弃 firstResponder,或者无论如何在它的视图 resignsFirstResponder 时保持 inputAccessoryView 停靠在屏幕底部?
InputAccessoryView
位于 ViewController 的层次结构之外 - 它包含在 UITextEffectsWindow
中,其根 ViewController 是 UIInputWindowController
。同样,键盘包含在 UIRemoteKeyboardWindow
及其自己的 UIInputWindowController
.
因此,如果我们从最高 window 或更高级别(UITextEffectsWindow
或 UIRemoteKeyboardWindow
)显示警报,它不会辞去第一响应者。
我找到的最简单的解决方案是:
let topViewController = UIApplication.shared.windows.last!.rootViewController!
topViewController.present(alert, animated: true, completion: nil)
理想情况下,您可以安全地处理这些可选值。一个可能更好的解决方案(我从以前的解决方案中看到了一些控制台错误)是创建一个具有更高 WindowLevel 的新 UIWindow,使其成为键 window 并且可见,并从那里显示警报。
对于那些寻找 Objective-C 相当于 Corey 答案的人:
UIViewController *objViewController = [UIApplication sharedApplication].windows.lastObject.rootViewController;
[objViewController presentViewController:view animated:YES completion:nil];
感谢@Corey W.(给他投票)我们有了解决这个问题的方法。 Swift 5:
中更安全的方法// Instantiate AlertController
let actionSheet = UIAlertController(title: title,
message: "Comment options",
preferredStyle: .actionSheet)
// Add actions
actionSheet.addAction(UIAlertAction(title: "Edit",
style: .default,
handler: { (_: UIAlertAction) in
self.showEditingView(withCommentId: commentId, withCommentText: commentText)
}))
// Present AlertController
if let lastApplicationWindow = UIApplication.shared.windows.last,
let rootViewController = lastApplicationWindow.rootViewController {
rootViewController.present(actionSheet, animated: true, completion: nil)
}