2012-07-04 16 views
5

Ho questo UITextView che funziona benissimo tranne, non riesco a ottenere il testo all'interno dello UITextView per iniziare a scorrere solo dopo che le dimensioni dello UITextView sono quasi esaurite, l'UITextView è alto 4 linee, ma non appena raggiungo la seconda linea, la prima linea viene spinta verso l'alto, non voglio che la vista inizi a scorrere finché non ho raggiunto la linea 5. scrollingEnabled = NO evita che scorra, quindi non ha funzionato.Come posso far scorrere UITextView solo quando è pieno di testo

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

risposta

0

si potrebbe utilizzare il metodo sizeWithFont:constrainedToSize:lineBreakMode: per verificare se la stringa sarà effettivamente rendere più grande la visualizzazione di testo e vedere se è necessario attivare lo scorrimento. Dovrai chiamarlo ogni volta che viene impostato il testo nella tua scrollview.

es:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

Quando l'UITextView viene caricato insieme scrollEnabled su NO. Quindi impostare delegato della vista testo per self o qualche altro oggetto e implementare il metodo UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView 

Questo metodo verrà chiamato in qualsiasi momento l'utente effettua una modifica al testo all'interno della vista. All'interno di questo metodo è necessario capire quanto è grande il tuo testo e se va oltre i limiti della visualizzazione del testo. In tal caso abiliti lo scorrimento. Utilizzare questo metodo:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

Questo è un metodo categoria UIKit su NSString. Restituisce un CGSize che ti dirà l'altezza di qualunque stringa di testo tu chiami. Nel tuo caso sarebbe qualcosa di simile

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

ho trovato la risposta, come gli altri con problemi simili hanno menzione, con un piccolo textView, aggiunge automaticamente 32 imbottitura per il fondo.

Una semplice soluzione è aggiungere YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); all'interno del metodo shouldChangeTextInRange, che ha risolto il problema!

2

L'impostazione di contentInset può aiutare il testo ad apparire più correttamente all'interno dello UITextView. Tuttavia, non risolverà il problema per cui lo UITextView ha lo scorrimento abilitato pur non avendo più testo da visualizzare.

Analogamente, i metodi come sizeWithFont presentano limitazioni. Come spiegato nell'eccellente serie di blog di Mike Weller iOS Development: You're Doing It Wrong, NSString non è un buon oggetto da chiedere per quanto riguarda l'ampiezza di un UIView. Molte sottoclassi UIView come UILabel, UIButton, ecc. Hanno inset e altre considerazioni che devono essere tenute in considerazione durante il dimensionamento. UITextLabel non fa eccezione.

particolare voce di Mike Weller su questo argomento è:

You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]

iOS 7 ci promette più sofisticata gestione del testo in UITextView, con proprietà come textContainerInset. Ma cosa fare nel frattempo?

Bene, per prima cosa sappiamo che UITextView è una sottoclasse di UIScrollView.Pertanto, la regola d'oro che se la contentSize è più grande della proprietà della vista bounds, la vista di scorrimento scorrerà in modo da poter vedere più contenuti.

Verificando contentSize agains il bounds non funziona o perché sappiamo che UIScrollView sta già calcolando se deve scorrere o meno in base al testo, e ci sta dando la risposta sbagliata.

Qui è dove i valori di regolazione arbitrari vengono in soccorso! Per me questo valore era 17.f. Per te - a seconda dei tuoi caratteri - potrebbe essere diverso. Prendiamo quindi il controllo e decidiamo se consentire lo scorrimento della vista per scorrere:

static const CGFloat kArbritaryHeight = 17.f; 
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight; 
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds); 
BOOL tooMuchContent = adjustedContentHeight > boundsHeight; 

if (tooMuchContent) 
{ 
    myTextView.scrollEnabled = YES; 
} 
else 
{ 
    myTextView.scrollEnabled = NO; 
} 
Problemi correlati