微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iOS 7 UIWebView键盘问题

我必须删除这个07/07这个吧,但对于iOS 7这个代码不起作用.

解决方法

我们用一些Objective C运行时欺骗来删除这个吧.

我们有一个类有一个方法

@interface _SwizzleHelper : NSObject @end

@implementation _SwizzleHelper

    -(id)inputAccessoryView
    {
        return nil;
    }

@end

一旦我们有一个网页视图,我们要从中删除该栏,我们迭代其滚动视图的子视图,并使用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_getTypeEncoding(method))

            objc_registerClasspair(newClass!)

            swizzledClassMapping += [newClass!]
        }

        object_setClass(subview!,newClass!)
    }
}

原文地址:https://www.jb51.cc/iOS/336289.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐