Per supportare il protocollo UIAccessibilityReadingContent
, ho bisogno del mio UITextView per rispondere alle domande sulle sue linee. Questi sono i metodi del protocollo che ho bisogno di implementare:Ottieni informazioni sulla linea da UITextView e NSLayoutManager
accessibilityLineNumberForPoint:
< - ha fornito una coordinata, restituisce un numero di rigaaccessibilityContentForLineNumber:
< - Restituisce il testo di una data lineaaccessibilityFrameForLineNumber:
< - Dato un numero di riga, restituisce il suo frameaccessibilityPageContent
< - L'intero contenuto del testo. Che ho. :)
Immagino che NSLayoutManager possa aiutarmi, ma non ne ho esperienza. Ho capito un po '(penso), ma ho ancora bisogno di aiuto.
Apple ha alcuni esempi di codice (here) che mi può ottenere il numero di righe nella visualizzazione di testo:
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs =
[layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
Ho capito che, con lineRange
sopra, posso calcolare la linea rettangoli di utilizzare questo metodo su NSLayoutManager
:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
E dato lineRanges
dovrei essere in grado di calcolare il numero di riga per un punto utilizzando (trovando la lineRange
che contiene l'indice di glifo:
- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction
Quindi, ciò che resta è, come faccio ad avere il contenuto di una linea (come NSString
), dato un numero di riga?
Sei sicuro di aver bisogno di quel protocollo, nel caso comune puoi semplicemente impostare NSTextStorage, NSLayoutManager e NSTextContainer e tutto andrà bene. Ho letto un grande argomento al riguardo: http://www.raywenderlich.com/50151/text-kit-tutorial. – kaspartus
Purtroppo si. UITextView non sembra fornire una lettura riga per riga quando VoiceOver è abilitato. Almeno non nella mia implementazione (UITextViews incorporato in UITableViewCells) –
'NSLayoutManager' offre metodi che funzionano con intervalli di glifi, oltre a metodi per intervalli di caratteri. Infine ci sono due metodi che ti permettono di convertire tra entrambi gli intervalli: '- [NSLayoutManager glyphRangeForCharacterRange: actualCharacterRange:]' e '- [NSLayoutManager characterRangeForGlyphRange: actualGlyphRange:]'. Per recuperare la stringa, converti semplicemente il glyphRange che ti interessa in un characterRange, quindi puoi recuperare una sottostringa dal 'textStorage' di' UITextView' usando 'attributeSubstringFromRange:' o sia 'string' che' substringWithRange: '. – Dalzhim