Resalte una sola línea en UITextView

Tengo un UITextView que tiene un NSAttributedString con dos saltos de línea entre cada línea. Estoy tratando de resaltar una sola línea en la vista de text. Simplemente puedo resaltar una oración en la vista de text sin ningún problema. Pero, necesito resaltar la oración desde el inicio de la línea (lado izquierdo de la vista de text) hasta el final de la línea (lado derecho de la vista de text)

He utilizado el siguiente código para resaltar una línea que proviene de esta muestra de Github . Como cada línea tiene dos saltos de línea, pensé que después de resaltar la oración real, también puedo get los caracteres de línea nueva y siguiente y resaltarlos también. Pero los resultados no son como yo quería.

introduzca la descripción de la imagen aquí

  // 1. create some fonts UIFontDescriptor* fontDescriptor = [UIFontDescriptor prefernetworkingFontDescriptorWithTextStyle:UIFontTextStyleBody]; UIFontDescriptor* boldFontDescriptor = [fontDescriptor fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold]; UIFont* boldFont = [UIFont fontWithDescriptor:boldFontDescriptor size: 0.0]; UIFont* normalFont = [UIFont prefernetworkingFontForTextStyle:UIFontTextStyleBody]; if (!_highlightedWorld) { _highlightedWorld = @""; } // Search for the highlighted world by using regex and highlight NSString* regexStr = _highlightedWorld; NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:0 error:nil]; // Highlighted attributes (Cyan font color, Bold) NSDictionary* boldAttributes = @{ NSFontAttributeName : boldFont, NSBackgroundColorAttributeName : [UIColor cyanColor]}; //Normal attributes NSDictionary* normalAttributes = @{ NSFontAttributeName : normalFont, NSBackgroundColorAttributeName : [UIColor whiteColor] }; // If the textview has multiple matches, iterate over each match, and highlight each. [regex enumerateMatchesInString:[_backingStore string] options:0 range:searchRange usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ // Highlight the actual line NSRange matchRange = [match rangeAtIndex:0]; [self addAttributes:boldAttributes range:matchRange]; // Get the newline after the highlighted sentence, and highlight it // Check if we reached the end if (matchRange.location+matchRange.length < [_backingStore string].length) { [self addAttributes:boldAttributes range:NSMakeRange(matchRange.location+matchRange.length, 1)]; } // Get the newline before the highlighted sentence, and highlight it // Check if we reached the beginning if (matchRange.location != 0) { [self addAttributes:boldAttributes range:NSMakeRange(matchRange.location-1, 1)]; } // 4. reset the style to the original if (NSMaxRange(matchRange)+1 < self.length) { [self addAttributes:normalAttributes range:NSMakeRange(NSMaxRange(matchRange)+1, 1)]; } }]; 

Recomendaría que no uses una vista de text para esto. Lo que tienes es una list, por lo que utilizar una vista de tabla o colección es mucho más adecuado para este caso de uso. Harán que el ancho del dispositivo de manejo y la selección de elementos sean realmente triviales. También le permiten agregar otro estilo alnetworkingedor de los elementos (que pueden ser útiles).

No he tenido que hacerlo antes, pero en este momento, con una vista de text, me imagino que tendrás que ver cómo se coloca el text en el layout y espero que tengas que hacer la alignment del centro explícitamente para que tú puede seleccionar el relleno de ambos lados sin conectar en cascada a la línea anterior o siguiente. Esto está lejos de ser trivial.

Me interesa saber si hay una solución simple para el problema de la vista de text, pero realmente parece que la vista equivocada se usa para los datos, la visualización y la interacción del usuario que está buscando.

No estoy seguro de cómo explicar esto, pero creo que tiene algo que ver con la interpretación de \ ny \ r por el iOS.

Estoy adivinando que podría haber creado el espacio entre líneas al usar dos \ r o dos \ n ie

 NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

O

 NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

Las forms en que su código para resaltar la línea produce la misma salida similar a la suya.

Pero, si reemplaza el segundo '\ n' o '\ r' por '\ r \ n' es decir,

 NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\r\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

O

 NSString *text = @"Shopping List\n\n1. Cheese\n\n2. Biscuits\n\r\n3 Sausages\n\n4. IMPORTANT Cash for going out!\n\n5. -potatoes-\n\n6. Acopy of iOS6 by tutorials\n\n7. A new iPhone\n\n8. A present for mum"; 

entonces obtienes el resultado deseado.