从UIWebView(iOS)中删除粗体,斜体和下划线选项

前端之家收集整理的这篇文章主要介绍了从UIWebView(iOS)中删除粗体,斜体和下划线选项前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我似乎无法从UIWebView中删除Bold,Italic和Underline选项.为什么这不可能?

CustomWebView.h:

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface CustomUIWebView : UIWebView
  4.  
  5. @end

CustomWebView.m:

  1. #import <Foundation/Foundation.h>
  2. #import "CustomUIWebView.h"
  3.  
  4. @implementation CustomUIWebView
  5.  
  6. -(BOOL)canPerformAction:(SEL)action withSender:(id)sender
  7. {
  8. return NO;
  9. return [super canPerformAction:action withSender:sender];
  10. }
  11.  
  12. @end

解决方法

我已经调查了很多来解决这个问题,最后找到了解决方案.我首先覆盖 – (BOOL)canPerformAction:(SEL)动作withSender:包含UIWebView的UIViewController中的(id)发送者足以阻止显示文本样式选项.但不幸的是,它并不像看起来那么容易.

这样做的主要原因是我们必须覆盖主要第一响应者的canPerformAction.从控制器调用[[[UIApplication sharedApplication] keyWindow] performSelector:@selector(firstResponder)]会通知我们UIWebBrowserView是实际的主要第一响应者.我们想要子类化UIWebBrowserView,但由于它是私有类,我们可能会在审核过程中拒绝Apple拒绝我们的应用程序.来自@Shayan RC的This answer建议执行一个方法调整以允许重写此方法而无需子类化UIWebBrowserView(从而防止App Store拒绝).

解决方

我们的想法是添加一个替代canPerformAction的新方法.我创建了一个包含我们想要保留在菜单中的所有方法签名的数组.要删除样式选项,我们只需要将@“_ showTextStyleOptions:”添加到此数组中.添加显示的所有其他方法签名(我已添加了签名的NSLog,以便您可以选择所需的方法签名).

  1. - (BOOL) mightPerformAction:(SEL)action withSender:(id)sender {
  2. NSLog(@"action : %@",NSStringFromSelector(action));
  3.  
  4. NSArray<NSString*> *selectorsToKeep = @[@"cut:",@"copy:",@"select:",@"selectAll:",@"_lookup:"]; //add in this array every action you want to keep
  5. if ([selectorsToKeep containsObject:NSStringFromSelector(action)]) {
  6. return YES;
  7. }
  8.  
  9. return NO;
  10. }

现在我们可以使用以下方法(来自@Shayan RC的答案)执行方法调配来调用前一个方法而不是canPerformAction.这将需要添加#import< objc / runtime.h>.

  1. - (void) replaceUIWebBrowserView: (UIView *)view {
  2. //Iterate through subviews recursively looking for UIWebBrowserView
  3. for (UIView *sub in view.subviews) {
  4. [self replaceUIWebBrowserView:sub];
  5. if ([NSStringFromClass([sub class]) isEqualToString:@"UIWebBrowserView"]) {
  6. Class class = sub.class;
  7.  
  8. SEL originalSelector = @selector(canPerformAction:withSender:);
  9. SEL swizzledSelector = @selector(mightPerformAction:withSender:);
  10.  
  11. Method originalMethod = class_getInstanceMethod(class,originalSelector);
  12. Method swizzledMethod = class_getInstanceMethod(self.class,swizzledSelector);
  13.  
  14. //add the method mightPerformAction:withSender: to UIWebBrowserView
  15. BOOL didAddMethod =
  16. class_addMethod(class,originalSelector,method_getImplementation(swizzledMethod),method_getTypeEncoding(swizzledMethod));
  17. //replace canPerformAction:withSender: with mightPerformAction:withSender:
  18. if (didAddMethod) {
  19. class_replaceMethod(class,swizzledSelector,method_getImplementation(originalMethod),method_getTypeEncoding(originalMethod));
  20. } else {
  21. method_exchangeImplementations(originalMethod,swizzledMethod);
  22. }
  23. }
  24. }
  25. }

最后,在viewDidLoad中调用prevIoUs方法,如下所示:[self replaceUIWebBrowserView:_webView].

方法调整似乎很难,但它允许您将代码保存在视图控制器中.如果您在实施以前的代码时遇到任何困难,请告诉我.

注意:使用WKWebView比使用UIWebView更容易实现此行为,并且不推荐使用UIWebView,您应该考虑切换到WKWebView.

猜你在找的iOS相关文章