iOS 7 UIWebView键盘问题
我必须像这里一样删除此条,但对于iOS 7,此代码不起作用。我们使用一些Objective C运行时技巧删除此条 我们有一个类,它有一个方法:iOS 7 UIWebView键盘问题,ios,ios7,uiwebview,Ios,Ios7,Uiwebview,我必须像这里一样删除此条,但对于iOS 7,此代码不起作用。我们使用一些Objective C运行时技巧删除此条 我们有一个类,它有一个方法: @interface _SwizzleHelper : NSObject @end @implementation _SwizzleHelper -(id)inputAccessoryView { return nil; } @end 一旦我们有了一个要从中删除条的web视图,我们就迭代它的滚动视图的子视图
@interface _SwizzleHelper : NSObject @end
@implementation _SwizzleHelper
-(id)inputAccessoryView
{
return nil;
}
@end
一旦我们有了一个要从中删除条的web视图,我们就迭代它的滚动视图的子视图,并使用UIWebDocumentView
类。然后,我们动态地将上面创建的类的超类作为子视图的类(UIWebDocumentView-但我们不能预先这么说,因为这是私有API),并将子视图的类替换为我们的类
#import "objc/runtime.h"
-(void)__removeInputAccessoryView
{
UIView* subview;
for (UIView* view in self.scrollView.subviews) {
if([[view.class description] hasPrefix:@"UIWeb"])
subview = view;
}
if(subview == nil) return;
NSString* name = [NSString stringWithFormat:@"%@_SwizzleHelper", 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([_SwizzleHelper class], @selector(inputAccessoryView));
class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method));
objc_registerClassPair(newClass);
}
object_setClass(subview, newClass);
}
与Swift 3.0中的上述内容等效:
import UIKit
import ObjectiveC
var swizzledClassMapping = [AnyClass]()
extension UIWebView {
func noInputAccessoryView() -> UIView? {
return nil
}
public func removeInputAccessoryView() {
var subview: AnyObject?
for (_, view) in scrollView.subviews.enumerated() {
if NSStringFromClass(type(of: view)).hasPrefix("UIWeb") {
subview = view
}
}
guard subview != nil else {
return
}
//Guard in case this method is called twice on the same webview.
guard !(swizzledClassMapping as NSArray).contains(type(of: subview!)) else {
return;
}
let className = "\type(of: subview!)_SwizzleHelper"
var newClass : AnyClass? = NSClassFromString(className)
if newClass == nil {
newClass = objc_allocateClassPair(type(of: subview!), className, 0)
guard newClass != nil else {
return;
}
let method = class_getInstanceMethod(type(of: self), #selector(UIWebView.noInputAccessoryView))
class_addMethod(newClass!, #selector(getter: UIResponder.inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method))
objc_registerClassPair(newClass!)
swizzledClassMapping += [newClass!]
}
object_setClass(subview!, newClass!)
}
}
我遇到了这个很棒的解决方案,但我也需要重新获得inputAccessoryView。我添加了这个方法:
- (void)__addInputAccessoryView {
UIView* subview;
for (UIView* view in self.scrollView.subviews) {
if([[view.class description] hasSuffix:@"SwizzleHelper"])
subview = view;
}
if(subview == nil) return;
Class newClass = subview.superclass;
object_setClass(subview, newClass);
}
它看起来确实像预期的那样工作,没有副作用,但我无法摆脱裤子着火的感觉
如果您想让Leo Natan的解决方案使用WKWebView而不是UIWebView,只需将前缀从“UIWeb”更改为“WKContent”。我在@bjomer中基于此制作了一个cocoapod 您可以替换inputaccessoryview,而不仅仅是隐藏它。我希望这能帮助有同样问题的人
你可以找到cocoapod页面。我创建了一个要点来实现这一点: 这是一个
UIWebView
类别,您只需更改customInputAccessoryView
属性:
@interface UIWebView (CustomInputAccessoryView)
@property (strong, nonatomic) UIView *customInputAccessoryView;
@end
您可以将其设置为nil
以删除它,也可以在其上设置新视图以更改它
请记住,这也使用私有API,因此使用风险自负,但似乎很多应用程序都会执行类似的操作。应用商店审批流程的解决方案如何?您是否批准了具有此代码的应用程序?是的,我们的应用程序代码与此类似,并且已获得批准。请将其放入您的
UIWebView
子类中。此外,您还需要在页面顶部导入“objc/runtime.h”file@iDhaval我们的应用程序已经被批准使用多年了。@LeoNatan我添加了一个swift 3版本-如果你不想要它,请随时回滚。嗨,伙计,谢谢你的回答,但这是一个老问题),但我会回到那个任务,我会检查它