Colocando el button como subvista justo al lado del último carácter de UILable / UITextView

He utilizado cuatro UITextviews para colocar cada párrafo. Ahora quiero agregar un UIButton como subvista para cada UITextview.

Me di count de que la creación de subvista con el marco CGRectMake(textview.frame.width-50,textview.frame.height-20,50,20) no es una solución ideal porque la oración puede terminar en cualquier lugar, quiero decir que el último carácter de cualquier párrafo puede terminar en cualquier lugar, su position no es constante.

Entonces, la conclusión es, quiero agregar el UIButton dentro de UITextView , justo al lado de la palabra lats. ¿Cómo puedo hacer eso?

Cualquier solución será muy apreciada. 🙂

No es tan simple Utilizando:

 CGSize sizeOfString = [string sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size]; 

puede get un CGSize para la cadena dada. Pero, al dar la cadena completa, resultará en un tamaño igual al tamaño de UITextView (por lo tanto, en la esquina inferior derecha)

Tienes que usar este método en la última línea de cada UITextField … y esta es la parte difícil. El resumen de palabras lo realiza CoreText, UITextView o UILabel no proporciona información sobre las líneas, posiciones, etc.

Tienes que calcularlo por ti mismo haciendo algo similar (el código no está tan limpio, te ayudaré más adelante si tienes problemas de comprensión):

 NSAttributedString* text = self.aTextView.attributedText; CTFramesetterRef fs = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)text); CGMutablePathRef path = CGPathCreateMutable(); CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000)); // why the -16? the frame should be the REAL TEXT FRAME, not the UITextView frame. If you look, there is a space between the view margin and the text. This is the baseline. Probably there is a method to calculate it progtwigtically, but I can't check now. In my case it seems like 8px (*2) CTFrameRef f = CTFramesetterCreateFrame(fs, CFRangeMake(0, 0), path, NULL); CTFrameDraw(f, NULL); NSRange lastRange; NSArray* lines = (__bridge NSArray*)CTFrameGetLines(f); id lastLineInArray = [lines lastObject]; CTLineRef theLine = (__bridge CTLineRef)lastLineInArray; CFRange range = CTLineGetStringRange(theLine); lastRange.length = range.length; lastRange.location = range.location - 1; NSLog(@"%ld %ld", range.location, range.length); CGPathRelease(path); CFRelease(f); CFRelease(fs); // this is the last line NSString *lastLine = [self.aTextView.text substringWithRange:lastRange]; 

Ahora puede usar:

CGSize sizeOfString = [lastLine sizeWithFont: self.aTextView.font constrainedToSize: self.aTextView.frame.size];

obtendrá el ancho y la altura de la cadena, y luego la position final de su button (para la position y: número de líneas tomadas desde el recuento de líneas de la matriz * altura de la cadena)

EDIT: un comentario sobre el espacio de la izquierda en UITextView (la razón por la que hay un -16 en esta línea)

 CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000)); 

Esto sucede porque el text no está realmente dentro de UITextView, pero dentro de una de sus subvistas: un UIWebDocumentView (class privada) que agrega inserciones. Después de algunas búsquedas, no puedo encontrar ningún método para get (legalmente) el valor de estas inserciones, necesarias para pasar el rect correcto a la function CGPathAddRect (). Puede hacer algunas testings para asegurarse de que siempre es 8pt 🙂 o cambiar a UILabel, que no tiene las inserciones de contenido

Debería considerar utilizar UIWebView o algunas vistas de text atribuidas a terceros que admitan dichas características.

UITextView utiliza internamente una vista web, por lo que es un trabajo no trivial para averiguar el layout exacto del text.

Creo que esa mejor forma de usar tableView. Un párrafo en una celda. Haz una celda sin borde y establece clearColor en el background de celdas. De esta forma, puedes agregar el button fácilmente.