2013-07-09 18 views
5

C'è un modo (è benvenuto un pazzo hacker) per ottenere la riga corrente come una stringa di un UITextView? Ciò include il ritorno a capo, ecc Per esempio, in questo caso:UITextView ottiene la riga corrente

enter image description here

Il metodo sarebbero tornati "? Overflow dello stack Non è grande I" perché questa è la linea di corrente in base cursore .

Potrebbe anche restituire "Questo è un test che ho effettuato per" o "penso così", in base alla posizione del cursore. Ho provato a lavorare con entrambi i metodi UITextView e quelli del protocollo UITextInput.

EDIT:

Ecco il codice che ho tentato di usare. Il motivo per cui ho bisogno di trovare la stringa è di ottenere la sua lunghezza, quindi questo è il motivo per cui vedrai il codice basato sull'interfaccia utente.

NSRange location = self.textView.selectedRange; 
NSString *searchString = [self.textView.text substringWithRange:NSMakeRange(0, location)]; 
CGSize currentStringDimensions = [searchString sizeWithFont:self.textView.font constrainedToSize:CGSizeMake(self.textView.frame.size.width, self.textView.frame.size.height) lineBreakMode:NSLineBreakByWordWrapping];  
float numberOfRows = (currentStringDimensions.width/(self.textView.frame.size.width)); 
float left = (float)(numberOfRows - (int)numberOfRows) * (self.textView.frame.size.width); 

Questo non funziona, tuttavia. Penso che potrebbe avere qualcosa con le parole che vengono incapsulate o con caratteri di dimensioni diverse, ma il valore di sinistra è incoerente o spenta dopo la prima riga.

+0

Mostra il codice che avete provato e ciò che effettivamente restituito, quanto vicino Hai (direi che 'UITextInput' è il approccio corretto). – Wain

+0

Aggiungerà la domanda principale con esso – roozbubu

+1

Vedi questo - http://stackoverflow.com/questions/4421267/how-to-get-text-from-nth-line-of-uilabel/14413484#14413484 – TheTiger

risposta

0

Ho finito per utilizzare il metodo caretRect di UITextInput per ottenere l'offset da sinistra. Ha funzionato perfettamente.

+1

Puoi postare codice funzionante per gli altri da vedere? – jonathanpeppers

+0

@jonathanpeppers Sfortunatamente, non posso. Questo era per uno stage retribuito che stavo facendo l'estate precedente, quindi il codice è inaccessibile. – roozbubu

+1

Riesci a implementare di nuovo l'esempio da solo e pubblicarlo? Sembra che questo sia il punto di StackOverflow, non dovrebbe essere la risposta accettata a meno che non contenga effettivamente la risposta. – jonathanpeppers

2

La seguente soluzione di codice sembra funzionare. Il "sé" in questo codice fa riferimento a un'istanza di UITextView.

- (NSString *) getLineString:(NSRange)range 
{ 
    NSLayoutManager *manager = self.layoutManager; 

    // Convert it to a glyph range 
    NSRange matchingGlyphRange = [manager glyphRangeForCharacterRange:range actualCharacterRange:NULL]; 

    // line fragment rect at location range 
    CGRect rect = [manager lineFragmentRectForGlyphAtIndex:matchingGlyphRange.location effectiveRange:nil]; 

    // obtain the line range for the line fragment rect 
    NSRange lineRange = [manager glyphRangeForBoundingRect:rect inTextContainer:self.textContainer]; 

    // extract the string out from lineRange 
    return [self.text substringWithRange:lineRange]; 
} 

// ... later 
NSLog(@"line %@", [self getLineString:self.selectedRange]); 
0

questo ha lavorato per me (auto = l'UITextView)

func getLineString() -> String { 
    return (self.text! as NSString).substringWithRange((self.text! as NSString).lineRangeForRange(self.selectedRange)) 
}