ios – 当焦点从UITextField和UIWebView更改时,如何避免键盘隐藏和显示?

前端之家收集整理的这篇文章主要介绍了ios – 当焦点从UITextField和UIWebView更改时,如何避免键盘隐藏和显示?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个要求,其中视图包含一个本机UITextField和一个UIWebView.问题是如果我将焦点从UITextView切换到UIWebView,键盘窗口会闪烁(隐藏然后显示).
即,我得到了UIKeyboardWillHideNotification和UIKeyboardDidShowNotification

但是,当我换另一种方式时,这种情况不会发生. ies,我只得到了UIKeyboardDidShowNotification

有没有办法避免这种闪烁效应?

注意:我也注意到如果我有多个UITextField和UIWebView,这个问题不会发生在相同类型的视图中.

解决方法

我通过下面的代码解决了这个问题.只需设置webView.usesGUIFixes = YES;它应该解决你的问题.下面的代码还允许您设置用于UIWebView键盘自定义输入视图:

UIWebView GUIFixes.h

  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface UIWebView (GUIFixes)
  4.  
  5. /**
  6. * @brief The custom input accessory view.
  7. */
  8. @property (nonatomic,strong,readwrite) UIView* customInputAccessoryView;
  9.  
  10. /**
  11. * @brief Wether the UIWebView will use the fixes provided by this category or not.
  12. */
  13. @property (nonatomic,assign,readwrite) BOOL usesGUIFixes;
  14.  
  15. @end

UIWebView GUIFixes.m

  1. #import "UIWebView+GUIFixes.h"
  2. #import <objc/runtime.h>
  3.  
  4. @implementation UIWebView (GUIFixes)
  5.  
  6. static const char* const kCustomInputAccessoryView = "kCustomInputAccessoryView";
  7. static const char* const fixedClassName = "UIWebBrowserViewMinusAccessoryView";
  8. static Class fixClass = Nil;
  9.  
  10. - (UIView *)browserView
  11. {
  12. UIScrollView *scrollView = self.scrollView;
  13.  
  14. UIView *browserView = nil;
  15. for (UIView *subview in scrollView.subviews) {
  16. if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) {
  17. browserView = subview;
  18. break;
  19. }
  20. }
  21.  
  22. return browserView;
  23. }
  24.  
  25. - (id)methodReturningCustomInputAccessoryView
  26. {
  27. UIView* view = [self performSelector:@selector(originalInputAccessoryView) withObject:nil];
  28.  
  29. if (view) {
  30.  
  31. UIView* parentWebView = self.superview;
  32.  
  33. while (parentWebView && ![parentWebView isKindOfClass:[UIWebView class]])
  34. {
  35. parentWebView = parentWebView.superview;
  36. }
  37.  
  38. UIView* customInputAccessoryView = [(UIWebView*)parentWebView customInputAccessoryView];
  39.  
  40. if (customInputAccessoryView) {
  41. view = customInputAccessoryView;
  42. }
  43. }
  44.  
  45. return view;
  46. }
  47.  
  48. - (BOOL)delayedBecomeFirstResponder
  49. {
  50. dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(0.01 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{
  51. [super becomeFirstResponder];
  52. });
  53.  
  54. return YES;
  55. }
  56.  
  57. - (void)ensureFixedSubclassExistsOfBrowserViewClass:(Class)browserViewClass
  58. {
  59. if (!fixClass) {
  60. Class newClass = objc_allocateClassPair(browserViewClass,fixedClassName,0);
  61. IMP oldImp = class_getMethodImplementation(browserViewClass,@selector(inputAccessoryView));
  62. class_addMethod(newClass,@selector(originalInputAccessoryView),oldImp,"@@:");
  63.  
  64. IMP newImp = [self methodForSelector:@selector(methodReturningCustomInputAccessoryView)];
  65. class_addMethod(newClass,@selector(inputAccessoryView),newImp,"@@:");
  66. objc_registerClassPair(newClass);
  67.  
  68. IMP delayedFirstResponderImp = [self methodForSelector:@selector(delayedBecomeFirstResponder)];
  69. Method becomeFirstResponderMethod = class_getInstanceMethod(browserViewClass,@selector(becomeFirstResponder));
  70. method_setImplementation(becomeFirstResponderMethod,delayedFirstResponderImp);
  71.  
  72. fixClass = newClass;
  73. }
  74. }
  75.  
  76. - (BOOL)usesGUIFixes
  77. {
  78. UIView *browserView = [self browserView];
  79. return [browserView class] == fixClass;
  80. }
  81.  
  82. - (void)setUsesGUIFixes:(BOOL)value
  83. {
  84. UIView *browserView = [self browserView];
  85. if (browserView == nil) {
  86. return;
  87. }
  88.  
  89. [self ensureFixedSubclassExistsOfBrowserViewClass:[browserView class]];
  90.  
  91. if (value) {
  92. object_setClass(browserView,fixClass);
  93. }
  94. else {
  95. Class normalClass = objc_getClass("UIWebBrowserView");
  96. object_setClass(browserView,normalClass);
  97. }
  98.  
  99. [browserView reloadInputViews];
  100. }
  101.  
  102. - (UIView*)customInputAccessoryView
  103. {
  104. return objc_getAssociatedObject(self,kCustomInputAccessoryView);
  105. }
  106.  
  107. - (void)setCustomInputAccessoryView:(UIView*)view
  108. {
  109. objc_setAssociatedObject(self,kCustomInputAccessoryView,view,OBJC_ASSOCIATION_RETAIN);
  110. }
  111.  
  112. @end

猜你在找的iOS相关文章