Come smettere di UITextView di scorrere verso l’alto quando si entra

Ho un UITextView incluso in un UITableViewCell . Il layout è corretto quando le viste vengono inizialmente visualizzate, ma quando clicco su UITextView si fa scorrere automaticamente un po ‘e la metà superiore dei caratteri sulla prima riga diventa invisibile.

Questa immagine è quando UITextView non è attivo:
UITextView non attivo http://sofit.miximages.com/iphone/uitextview-notactive.png

E questo è quando ho cliccato su UITextView per renderlo attivo:
UITextView active http://sofit.miximages.com/iphone/uitextview-active.png

Non riesco a far scorrere UITextView, dovrebbe rimanere fisso. Come posso raggiungere questo objective? Ho già provato diverse impostazioni in Interface Builder , ma finora non ho avuto fortuna.

Qualsiasi suggerimento è apprezzato.

Gero

Questo è il modo in cui UITextView si comporta secondo l’ingegnere di Apple e UITextView è pensato per il testo con almeno alcune righe in altezza. Non ci sono problemi, usa invece un UITextField o aumenta il tuo UITextView ad almeno 3 linee in altezza.

UITextView è una sottoclass di UIScrollView, quindi ha una proprietà configurabile contentInset. Sfortunatamente, se provi a cambiare contentInset su un’istanza di UITextView, l’inset sul margine inferiore viene sempre reimpostato su 32. L’ho incontrato prima con i frame UITextView corti e ho trovato che questo era un problema. Sospetto che questo sia ciò che sta causando il tuo problema, ma per accertarti di sicuro devi controllare il contentInset della tua vista testo nel debugger.

La soluzione / soluzione è semplice: sottoclass UITextView e sovrascrive il metodo contentInset in modo che restituisca sempre UIEdgeInsetZero. Prova questo:

 // // BCTextView // // UITextView seems to automatically be resetting the contentInset // bottom margin to 32.0f, causing strange scroll behavior in our small // textView. Maybe there is a setting for this, but it seems like odd behavior. // override contentInset to always be zero. // @interface BCZeroEdgeTextView : UITextView @end @implementation BCZeroEdgeTextView - (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; } @end 

Puoi anche solo fare:

 textView.contentInset=UIEdgeInsetsZero; 

nel tuo file delegato.

UITextView è una sottoclass di UIScrollView , quindi la risposta riguarda la proprietà contentOffset , che è ciò che viene modificato, non gli inset o le dimensioni del contenuto. Se la posizione di scorrimento è corretta quando viene visualizzata per la prima volta la vista, è ansible memorizzare l’offset del contenuto per il successivo richiamo.

YourViewController.h snipped

 @interface YourViewController : UIViewController  @property(nonatomic, weak) IBOutlet UITextView *textView; @end 

YourViewController.m snippet

 @implementation YourViewController { @private BOOL _freezeScrolling; CGFloat _lastContentOffsetY; } // UITextViewDelegate - (void)textViewDidBeginEditing:(UITextView *)textView { // tell the view to hold the scrolling _freezeScrolling = YES; _lastContentOffsetY = self.textView.contentOffset.y; } // UITextViewDelegate - (void)textViewDidEndEditing:(UITextView *)textView { _freezeScrolling = NO; } // UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_freezeScrolling) { // prevent the scroll view from actually scrolling when we don't want it to [self repositionScrollView:scrollView newOffset:CGPointMake(scrollView.contentOffset.x, _lastContentOffsetY)]; } } // UIScrollViewDelegate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // scroll prevention should only be a given scroll event and turned back off afterward _freezeScrolling = NO; } // UIScrollViewDelegate - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { // when the layout is redrawn, scrolling animates. this ensures that we are freeing the view to scroll _freezeScrolling = NO; } /** This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method. */ - (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset { CGRect scrollBounds = scrollView.bounds; scrollBounds.origin = offset; scrollView.bounds = scrollBounds; } 

Ciò che è anche importante notare nel codice di esempio sopra è l’ultimo metodo. Chiamando qualsiasi tipo di setContentOffset: in realtà attiverà lo scorrimento, il che si scrollViewDidScroll: nel chiamare scrollViewDidScroll: Quindi chiamare setContentOffset: genera un ciclo infinito. Impostare i limiti di scorrimento è la soluzione per questo.

In poche parole, diciamo al controller della vista per impedire che UITextView quando rileviamo che l’utente ha selezionato il testo per la modifica. Inoltre memorizziamo l’attuale offset di contenuto (poiché sappiamo che la posizione è ciò che vogliamo). Se UITextView tenta di scorrere, UITextView lo UITextView del contenuto in posizione fino allo scrollViewDidEndDecelerating: dello scorrimento (che triggers scrollViewDidEndDecelerating: o scrollViewDidEndScrollingAnimation: . Scolleghiamo anche lo scorrimento quando l’utente ha terminato le modifiche.

Ricorda, questo è un esempio di base, quindi dovrai modificare il codice in base al comportamento esatto che desideri.

Stavo riscontrando un problema simile con UITextView scorrimento UITextView indesiderato. Sono finalmente riuscito a sistemarlo ripristinando il contenutoSize alla fine della mia keyboardDidShow:

 - (void)keyboardDidShow:(NSNotification *)notification { textView.contentSize = CGSizeZero; } 

Dovrai anche registrarti per la notifica della tastiera, in questo modo:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; 

Nel mio caso non volevo nessuno scorrimento visto che stavo ripristinando il fotogramma all’altezza del textView contentSize quando textViewDidChange (textview crescente all’interno di un UIScrollView ).

Prova a mettere in Redraw sulla vista testo invece di Ridimensiona per riempire. Potrebbe comunque essere necessario acquisire il delegato e mantenere l’offset del contenuto, ma dovrebbe almeno impedire il salto al punto (0,0). Anche la sottosegnalazione Autoresizes deve essere distriggersta. Stava saltando sempre in cima alla textview ogni volta anche su di me e questo ha risolto il problema.

inserisci la descrizione dell'immagine qui