2013-09-21 10 views
19

Ho appena trovato un fastidioso bug con la nuova proprietà keyboardDismissMode dello scroll view. Quando si utilizza questo con un text view con il valore UIScrollViewKeyboardDismissModeInteractive e la tastiera viene ignorata, lo scroll view sembra saltare in alto prima che continui a decelerare.Tastiera UITextViewDismissMode Bug

Ho archiviato un bug report con Apple ma ho bisogno di una soluzione alternativa. Ho provato il DAKeyboardControl senza il nuovo supporto iOS7 che dietro le quinte sta usando il keyboardDismissMode e lo fa ancora che per me indica che questo è un problema molto più profondo.

Qualche suggerimento?

+0

sto cercando di riprodurre. Ho aggiunto una vista testuale su una finestra e ho un testo lungo. Ho impostato la modalità di rimozione della tastiera su interattiva. Ho aggiunto un'implementazione di 'scrollViewDidScroll:' per catturare strani salti. Funziona come previsto. Potresti per favore approfondire il tuo caso d'uso? –

+0

Ho pubblicato il mio progetto di esempio qui: http://cl.ly/013q0t022j0l. Il progetto è una singola visualizzazione di testo in uno storyboard con un testo di lorem ipsum. I registri del controller della vista per la tastiera hanno nascosto la notifica ed è anche il delegato della visualizzazione del testo. Sto registrando la notifica hide not e la posizione y dell'offset del contenuto quando scorre la vista scroll. – Dino

+0

Se si esegue il progetto e si chiude la tastiera, verranno visualizzati alcuni numeri piuttosto irregolari provenienti dal metodo scrollViewDidScroll dopo l'attivazione della notifica hide. – Dino

risposta

0

Sembra un errore o solo uno stato predefinito non ideale. Ma in base al codice nel progetto di test, qualcosa di simile al sotto potrebbe funzionare dopo un tuning più preciso.

Ci sono due problemi con il codice di esempio, uno è che non si sta facendo nulla sulla dimensione del testo quando appare la tastiera, quindi non è possibile utilizzare o vedere il testo sotto la tastiera. Esistono altre soluzioni, ma una soluzione rapida e sporca consiste nel modificare le dimensioni del fotogramma (in un'app di sottomissione, prenderei anche le informazioni sull'animazione e animare il cambio del fotogramma di visualizzazione in modo che corrisponda all'animazione della tastiera che va oltre lo scopo di questa domanda). Lo fai in 'willShow' o simili, e lo riporti in 'didHide' o simili.

Quindi, l'offset del contenuto viene scartato quando è nascosto e sembra che ci siano stati strani stati mentre lo si trascina fuori dallo schermo prima e intorno ai callback per nascondere e scorrere le modifiche. Ho appena salvato lo stato e lo "aggiusto" una volta che la tastiera scompare e ho aggiornato la visualizzazione del testo.

Ho creato alcune proprietà e una presa nello storyboard per fondere la visualizzazione del testo.

 
- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil]; 
} 

- (void) keyboardWillShow:(NSNotification *)notification 
{ 
    NSDictionary * info = [notification userInfo]; 
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect rect = self.textView.frame; 
    rect.size.height -= size.height; 
    self.textView.frame = rect; 
} 

- (void)keyboardDidHide:(NSNotification *)notification 
{ 
    NSLog(@"====== keyboardDidHide ======="); 

    NSDictionary * info = [notification userInfo]; 
    CGSize size = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 

    CGRect rect = self.textView.frame; 
    rect.size.height += size.height; 
    self.textView.frame = rect; 


    self.hidingKeyboard = YES; 
} 

- (void) scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@"%f", scrollView.contentOffset.y); 
    if(self.hidingKeyboard == YES) 
    { 
     scrollView.contentOffset = self.lastOffset; 
     self.hidingKeyboard = NO; 
     NSLog(@"====== reset ======="); 
    } 
    else 
     self.lastOffset = scrollView.contentOffset; 
} 
+0

Lo scopo del codice di esempio era di dimostrare il bug causato dal licenziamento della tastiera. Apprezzo il fatto che non è possibile visualizzare il testo dietro la tastiera, ma questo non ha nulla a che fare con il bug che sto chiedendo. Non includendo il codice che cambia il frame quando viene visualizzata la tastiera, è possibile escludere la possibilità che causi/contribuisca al problema. – Dino

+0

Inoltre ho implementato la correzione per l'offset del contenuto incasinato dopo che la tastiera si nasconde e non funziona anche quando non c'è decelerazione. – Dino

+0

Descrivi di più l'interazione che stai tentando e ciò che stai vedendo.Quando trascino dal textView sulla tastiera, fuori dallo schermo, le padelle della tastiera e il codice sopra mantengono il testo che vedo sullo schermo nella stessa posizione che mi aspetto che sia (cioè lo trascino giù con la tastiera). – EricLeaf

1

per questo problema meglio codice con scrollviewDelegete e semplicemente parlare di quando si vuole respingere la tastiera attraverso resignFirstResponder