我们的应用程序中有一个webview,可以半生命周期的方式编辑一些文本。它只是一个全屏文本区域,因此我们不希望键盘上的下一个/上一个/完成按钮占用宝贵的屏幕空间。以前,以下工作删除了显示这些按钮的整个栏:
-(void)__removeInputAccessoryView {
UIView* subview;
for (UIView* view in _editorView.scrollView.subviews) {
if([[view.class description] hasPrefix:@"UIWeb"])
subview = view;
}
if(subview == nil) {
return;
}
NSString* name = [NSString stringWithFormat:@"%@RWWebviewHelper", subview.class.superclass];
Class newClass = NSClassFromString(name);
if(newClass == nil) {
newClass = objc_allocateClassPair(subview.class, [name cStringUsingEncoding:NSASCIIStringEncoding], 0);
if(!newClass) {
return;
}
Method method = class_getInstanceMethod([RWWebviewHelper class], @selector(inputAccessoryView));
class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method));
objc_registerClassPair(newClass);
}
object_setClass(subview, newClass);
}
我在Objective-C和Swift的SO和Github上找到了类似的片段。我目前正在将这个类从Objective-C转换为Swift 和,从使用UIWebView到使用WKWebView。我在某处发现了这个:
private func removeInputAccessoryView() {
final class FauxBarHelper: NSObject {
var inputAccessoryView: AnyObject? { return nil }
}
editorView.scrollView.subviews.forEach { view in
if String(describing: type(of: view)).hasPrefix("WKcon") {
let noInputAccessoryViewClassName = "\(view.superclass!)_NoInputAccessoryView"
var newClass: AnyClass? = NSClassFromString(noInputAccessoryViewClassName)
if newClass == nil {
let targetClass: AnyClass = object_getClass(view)
newClass = objc_allocateClassPair(targetClass, noInputAccessoryViewClassName.cString(using: String.Encoding.ascii)!, 0)
}
let originalMethod = class_getInstanceMethod(FauxBarHelper.self, #selector(getter: FauxBarHelper.inputAccessoryView))
class_addMethod(newClass!.self, #selector(getter: FauxBarHelper.inputAccessoryView), method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
object_setClass(view, newClass)
}
}
}
但它并没有隐藏吧。我不太熟悉黑客私有API,在玩了那个片段中的值之后,我找不到隐藏条形的方法。我知道这是商店拒绝风险,但你知道客户是怎样的。我需要让这个工作。我可以使用Objective-C片段,但更喜欢Swift。
有没有人有想法?我觉得从屏幕键盘上隐藏按钮栏应该不是很难,我错过了一些简单的东西吗?