2013-01-16 6 views
5

Użyłem czterech UITextviews do umieszczenia każdego akapitu. Teraz chcę dodać UIButton jako wyeksponowanie dla każdego widoku UITextview.Umieszczanie przycisku jako podglądu tuż obok ostatniego znaku UILable/UITextView

Uświadomiłem sobie, że tworzenie podglądu z ramką CGRectMake(textview.frame.width-50,textview.frame.height-20,50,20) nie jest idealnym rozwiązaniem, ponieważ zdanie może się skończyć gdziekolwiek, mam na myśli ostatni znak dowolnego akapitu może się gdziekolwiek skończyć, jego pozycja nie jest jednak stała.

Więc podstawą jest, chcę dodać UIButton w obrębie UITextView, tuż obok słowa łats. Jak mogę to zrobić?

Każde rozwiązanie zostanie bardzo docenione. :)

Odpowiedz

5

To nie jest takie proste. Zastosowanie:

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

można uzyskać CGSize dla danego łańcucha. Ale podając cały ciąg, otrzymamy rozmiar równy rozmiarowi twojego UITextView (tak, prawy dolny róg)

Musisz użyć tej metody w ostatnim wierszu każdego UITextField ... i to jest trudna część. Zawijanie słów jest wykonywane przez CoreText, UITextView lub UILabel nie daje informacji o pojedynczych liniach, pozycjach itd.

Musisz to obliczyć samemu, wykonując coś podobnego (kod nie jest tak czysty, ja ' ll help później jeśli masz problem zrozumienia):

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 programatically, 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]; 

teraz można użyć:

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

można uzyskać szerokość i wysokość napisu, a następnie ostateczną pozycję swojej przycisk (na stanowisko y: liczba linii pobranych z linii wysokości tablicy count * string)

EDIT: a komentarz do lewej przestrzeni w UITextView (powód dlaczego nie ma w tym wierszu -16)

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

Zdarza się, ponieważ tekst nie jest tak naprawdę wewnątrz UITextView, ale w środku jednego z jego subviews: AN UIWebDocumentView (klasa prywatna), która dodaje wstawki. Po pewnym przeszukaniu nie mogę znaleźć żadnej metody uzyskania (legalnie) wartości tych wstawek, niezbędnych do przekazania prawidłowego rect do funkcji CGPathAddRect(). Możesz zrobić kilka testów, aby upewnić się, że zawsze jest 8pt :-) lub przejść do UILabel, które nie ma tej zawartości wstawek

+0

Tak, nie potrzebujesz -16 jeśli używasz UILabel, nie ma margines w tym przypadku ;-) Cieszę się, że rozwiązałeś swój problem! Szczęśliwe kodowanie ;-) – LombaX

0

Należy rozważyć użycie UIWebView lub widoków tekstowych przypisanych osobom trzecim, które obsługują takie funkcje.

UITextView wewnętrznie korzysta z widoku internetowego, co sprawia, że ​​praca jest nietypowa, ponieważ pozwala dokładnie określić układ tekstu.

-2

Myślę, że lepszy sposób użycia tableView. Jeden akapit w jednej komórce. Utwórz komórkę bez obramowania i ustaw clearColor na tło komórki. W ten sposób można łatwo dodać przycisk.

Powiązane problemy