我一直在寻找一个简单的答案,但我似乎找不到它。
如果键盘上存在附件视图,我想查找并替换附加到我的 UIWebView 的键盘的 inputAccessoryView。我想更换它,这样我就可以拥有自己的 Prev 和 Next 按钮。快速完成它是一个加号。
听起来很简单,但并不明显。
我一直在寻找一个简单的答案,但我似乎找不到它。
如果键盘上存在附件视图,我想查找并替换附加到我的 UIWebView 的键盘的 inputAccessoryView。我想更换它,这样我就可以拥有自己的 Prev 和 Next 按钮。快速完成它是一个加号。
听起来很简单,但并不明显。
import UIKit
extension UIViewController {
func addNewAccessoryView(oldAccessoryView:UIView)
{
var frame = oldAccessoryView.frame;
var newAccessoryView = UIView(frame:frame)
newAccessoryView.backgroundColor = UIColor.lightGrayColor()
let fn = ".HelveticaNeueInterface-Bold"
var doneButton = UIButton(frame:CGRectMake(frame.size.width-80,6,100,30))
doneButton.setTitle("Done", forState: UIControlState.Normal)
doneButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
doneButton.titleLabel!.font = UIFont(name: fn, size: 15)
doneButton.addTarget(self, action: "buttonAccessoryDoneAction:", forControlEvents: UIControlEvents.TouchUpInside)
var prevButton = UIButton(frame:CGRectMake(2,6,50,30))
prevButton.setTitle("<", forState: UIControlState.Normal)
prevButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
prevButton.titleLabel!.font = UIFont(name: fn, size: 15)
prevButton.addTarget(self, action: "buttonAccessoryPrevAction:", forControlEvents: UIControlEvents.TouchUpInside)
var nextButton = UIButton(frame:CGRectMake(35,6,50,30))
nextButton.setTitle(">", forState: UIControlState.Normal)
nextButton.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
nextButton.titleLabel!.font = UIFont(name: fn, size: 15)
nextButton.addTarget(self, action: "buttonAccessoryNextAction:", forControlEvents: UIControlEvents.TouchUpInside)
newAccessoryView.addSubview(prevButton);
newAccessoryView.addSubview(nextButton);
newAccessoryView.addSubview(doneButton);
oldAccessoryView.addSubview(newAccessoryView)
}
func traverseSubViews(vw:UIView) -> UIView
{
if (vw.description.hasPrefix("<UIWebFormAccessory")) {
return vw
}
for(var i = 0 ; i < vw.subviews.count; i++) {
var subview = vw.subviews[i] as UIView;
if (subview.subviews.count > 0) {
var subvw = self.traverseSubViews(subview)
if (subvw.description.hasPrefix("<UIWebFormAccessory")) {
return subvw
}
}
}
return UIView()
}
func replaceKeyboardInputAccessoryView()
{
// locate accessory view
let windowCount = UIApplication.sharedApplication().windows.count
if (windowCount < 2) {
return;
}
let tempWindow:UIWindow = UIApplication.sharedApplication().windows[1] as UIWindow
var accessoryView:UIView = traverseSubViews(tempWindow)
if (accessoryView.description.hasPrefix("<UIWebFormAccessory")) {
// Found the inputAccessoryView UIView
if (accessoryView.subviews.count > 0) {
self.addNewAccessoryView(accessoryView)
}
}
}
// Override these in your UIViewController
func buttonAccessoryNextAction(sender:UIButton!)
{
println("Next Clicked")
}
func buttonAccessoryPrevAction(sender:UIButton!)
{
println("Prev Clicked")
}
func buttonAccessoryDoneAction(sender:UIButton!)
{
println("Done Clicked")
}
}
然后从你的UIViewController
设置里面Notification
当键盘出现时。您可以在viewDidAppear()
.
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name:UIKeyboardDidShowNotification, object: nil);
并从您的处理程序中keyboardDidShow
调用replaceKeyboardInputAccessoryView
.UIViewController
func keyboardDidShow(notification: NSNotification) {
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
self.replaceKeyboardInputAccessoryView()
}
}
user3670534 解决方案工作正常,但如果窗口的顺序发生更改,您可以使用以下命令获取正确的窗口:
var tempWindow: UIWindow!;
for window in UIApplication.sharedApplication().windows {
if (window.description.hasPrefix("<UITextEffectsWindow")) {
tempWindow = window
}
}
I posted a gist to accomplish this: https://gist.github.com/kgaidis/5f9a8c7063b687cc3946fad6379c1a66
It's a UIWebView
category where all you do is change the customInputAccessoryView
property:
@interface UIWebView (CustomInputAccessoryView)
@property (strong, nonatomic) UIView *customInputAccessoryView;
@end
Keep in mind, this uses private API's, so use at your own risk, but it seems like a lot of apps do similar things nonetheless.
在斯威夫特 3
我删除了内置的附件视图,然后使用 XIB 构建了自己的视图。(感谢@Rob)这显示了如何删除内置视图:
WebViewExtensions.swift:
import UIKit
extension UIViewController {
func removeInputAccessoryView() {
// locate accessory view
let windowCount = UIApplication.shared.windows.count
if (windowCount < 2) {
return;
}
let tempWindow:UIWindow = UIApplication.shared.windows[1] as UIWindow
let accessoryView:UIView = traverseSubViews(vw: tempWindow)
if (accessoryView.description.hasPrefix("<UIWebFormAccessory")) {
// Found the inputAccessoryView UIView
accessoryView.removeFromSuperview()
}
}
func traverseSubViews(vw:UIView) -> UIView
{
if (vw.description.hasPrefix("<UIWebFormAccessory")) {
return vw
}
for i in (0 ..< vw.subviews.count) {
let subview = vw.subviews[i] as UIView;
if (subview.subviews.count > 0) {
let subvw = self.traverseSubViews(vw: subview)
if (subvw.description.hasPrefix("<UIWebFormAccessory")) {
return subvw
}
}
}
return UIView()
}
}
WKWebView
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardDidShow, object: nil, queue: nil) { (notification) in
if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
self.removeInputAccessoryView()
}
}
}
通过使用上面的解决方案,可以修改它。