2013-08-03 16 views
6

Ho un requisito in cui la vista contiene un UITextField nativo e un UIWebView. Il problema è se si passa lo stato attivo da UITextView a UIWebView, lo sfarfallio della tastiera della tastiera (nasconde e quindi mostra). ie, ho ottenuto UIKeyboardWillHideNotification e UIKeyboardDidShowNotificationCome evitare di nascondere e mostrare la tastiera quando il focus cambia da UITextField e UIWebView?

Ma, questo non accade quando si passa dall'altra parte. sì, ho ottenuto solo UIKeyboardDidShowNotification

C'è un modo per evitare questo effetto sfarfallio?

Nota: noto anche se ho più UITextField e UIWebView, questo problema non si verifica con lo stesso tipo di visualizzazione.

+0

hey si desidera mostrare la tastiera quando passi da webView a UITextView? – Ranjit

+0

Non esattamente. La tastiera stava mostrando quando lo stato attivo è in UITextView. Ora sto passando lo stato attivo a UIWebView. Lampeggia a questo punto. – Manoj

+0

a fuoco, vuoi dire clic? – Ranjit

risposta

8

Ho risolto questo problema tramite il codice qui sotto. Basta impostare webView.usesGUIFixes = YES; e dovrebbe risolvere il tuo problema. Il codice di seguito anche consente di impostare una visualizzazione di ingresso personalizzato da utilizzare per la tastiera UIWebView:

UIWebView + GUIFixes.h

#import <UIKit/UIKit.h> 

@interface UIWebView (GUIFixes) 

/** 
* @brief  The custom input accessory view. 
*/ 
@property (nonatomic, strong, readwrite) UIView* customInputAccessoryView; 

/** 
* @brief  Wether the UIWebView will use the fixes provided by this category or not. 
*/ 
@property (nonatomic, assign, readwrite) BOOL usesGUIFixes; 

@end 

UIWebView + GUIFixes.m

#import "UIWebView+GUIFixes.h" 
#import <objc/runtime.h> 

@implementation UIWebView (GUIFixes) 

static const char* const kCustomInputAccessoryView = "kCustomInputAccessoryView"; 
static const char* const fixedClassName = "UIWebBrowserViewMinusAccessoryView"; 
static Class fixClass = Nil; 

- (UIView *)browserView 
{ 
    UIScrollView *scrollView = self.scrollView; 

    UIView *browserView = nil; 
    for (UIView *subview in scrollView.subviews) { 
     if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) { 
      browserView = subview; 
      break; 
     } 
    } 

    return browserView; 
} 

- (id)methodReturningCustomInputAccessoryView 
{ 
    UIView* view = [self performSelector:@selector(originalInputAccessoryView) withObject:nil]; 

    if (view) { 

     UIView* parentWebView = self.superview; 

     while (parentWebView && ![parentWebView isKindOfClass:[UIWebView class]]) 
     { 
      parentWebView = parentWebView.superview; 
     } 

     UIView* customInputAccessoryView = [(UIWebView*)parentWebView customInputAccessoryView]; 

     if (customInputAccessoryView) { 
      view = customInputAccessoryView; 
     } 
    } 

    return view; 
} 

- (BOOL)delayedBecomeFirstResponder 
{ 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.01 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [super becomeFirstResponder]; 
    }); 

    return YES; 
} 

- (void)ensureFixedSubclassExistsOfBrowserViewClass:(Class)browserViewClass 
{ 
    if (!fixClass) { 
     Class newClass = objc_allocateClassPair(browserViewClass, fixedClassName, 0); 
     IMP oldImp = class_getMethodImplementation(browserViewClass, @selector(inputAccessoryView)); 
     class_addMethod(newClass, @selector(originalInputAccessoryView), oldImp, "@@:"); 

     IMP newImp = [self methodForSelector:@selector(methodReturningCustomInputAccessoryView)]; 
     class_addMethod(newClass, @selector(inputAccessoryView), newImp, "@@:"); 
     objc_registerClassPair(newClass); 

     IMP delayedFirstResponderImp = [self methodForSelector:@selector(delayedBecomeFirstResponder)]; 
     Method becomeFirstResponderMethod = class_getInstanceMethod(browserViewClass, @selector(becomeFirstResponder)); 
     method_setImplementation(becomeFirstResponderMethod, delayedFirstResponderImp); 

     fixClass = newClass; 
    } 
} 

- (BOOL)usesGUIFixes 
{ 
    UIView *browserView = [self browserView]; 
    return [browserView class] == fixClass; 
} 

- (void)setUsesGUIFixes:(BOOL)value 
{ 
    UIView *browserView = [self browserView]; 
    if (browserView == nil) { 
     return; 
    } 

    [self ensureFixedSubclassExistsOfBrowserViewClass:[browserView class]]; 

    if (value) { 
     object_setClass(browserView, fixClass); 
    } 
    else { 
     Class normalClass = objc_getClass("UIWebBrowserView"); 
     object_setClass(browserView, normalClass); 
    } 

    [browserView reloadInputViews]; 
} 

- (UIView*)customInputAccessoryView 
{ 
    return objc_getAssociatedObject(self, kCustomInputAccessoryView); 
} 

- (void)setCustomInputAccessoryView:(UIView*)view 
{ 
    objc_setAssociatedObject(self, 
          kCustomInputAccessoryView, 
          view, 
          OBJC_ASSOCIATION_RETAIN); 
} 

@end 
+0

Solo così ragazzi lo sapete. Abbiamo finito per spostare UITextField nella vista Web come un div separato contentEditable. Questo ha risolto i problemi di nascondere la tastiera senza la necessità di questa soluzione alternativa. – diegoreymendez

Problemi correlati