2014-06-30 14 views
17

Mam UILabel, które muszę przekonwertować na UITextView, ponieważ istnieją powody. Kiedy to robię, tekst nie jest ustawiony tak samo, pomimo użycia tej samej (niestandardowej) czcionki.Jak utworzyć tekst układu UITextView tak, jak tekst UILabel?

stwierdziliśmy, że jeśli ustawić:

textView.textContainer.lineFragmentPadding = 0; 
textView.textContainerInset = UIEdgeInsetsZero; 

To dostaje tekst bardzo blisko, ale jeśli nałożyć UITextView na górze UILabel widzę pozycjonowanie tekst się dalej od siebie przy każdej nowej linii.

Screen shot showing text drift.

UILabel zielono, UITextView czarny. To jest użycie NSParagraphStyle do ustawienia minimalnej i maksymalnej wysokości linii na 15.

Grałem z ustawianiem stylu akapitu i wysokości linii min/max, ale nie byłem w stanie dokładnie go dopasować. Nie jestem drukarzem, więc niekoniecznie rozumiem wszystkie terminy związane z czcionkami w dokumentacji dla NSLayoutManager i NSTextContainer i tak dalej.

Muszę tylko obsługiwać iOS 7 i nowsze.

Nie zamieniam się na szalony niestandardowy widget oparty na CoreTextu ani na losowej bibliotece stron trzecich. Jestem w porządku z wystarczająco blisko, jeśli muszę. Wygląda jednak na to, że powinna istnieć jakaś kombinacja losowych właściwości, aby ich układ był taki sam.

+0

Moja czcionka to HelveticaNeue 13, jeśli jest to pomocne. –

Odpowiedz

13

Zrobiłem to rozwiązanie, aby znaleźć odstęp między wierszami at this link i zastosowałem go do Twojego problemu. Udało mi się to uzyskać niewiarygodnie blisko, dostosowując właściwość lineSpacing. Testowałem z HelveticaNeue w rozmiarze 13 i udało mi się ustawić go tak, jak pokazano na zrzucie ekranu poniżej.

textView.textContainer.lineFragmentPadding = 0; 
textView.textContainerInset = UIEdgeInsetsZero; 

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 

paragraphStyle.lineSpacing = -0.38; 

NSDictionary *attrsDictionary = 
@{ NSFontAttributeName: [UIFont fontWithName:@"HelveticaNeue" size:13.0f], 
NSParagraphStyleAttributeName: paragraphStyle}; 

textView.attributedText = [[NSAttributedString alloc] initWithString:textView.text attributes:attrsDictionary]; 

Screen Shot

+0

Wygląda na obejście problemu, ale nie jest rozwiązaniem. Okazuje się, że boundingRectWithSize: dla NSAttributedString zwraca rozmiar, który odpowiada rozmiarowi renderowania przez UITextView, ale nie UILabel. Co jeśli potrzebuję używać UILabel, ale rozmiar boundingReadWithSize nie odpowiada temu rozmiarowi? – vahotm

+0

@ user2327139 Zgadzam się, że jest to raczej rozwiązanie zastępcze niż rozwiązanie. Jeśli chodzi o twoje pytanie, nie jestem do końca pewien, o co prosisz, ale jeśli masz nowe pytanie, użyj linku "Zadaj pytanie". Dodaj link do tego pytania, jeśli uważasz, że byłoby to pomocne. – Stonz2

+0

Jeśli używasz przypisanych ciągów zarówno dla UILabel, jak i UITextView, możesz ustawić odstępy między wierszami w obu. Bez hacków. – phatmann

3

byłem w stanie skutecznie 'podszywać' się nieedytowalny multilinii UILabel (jak to się dzieje, w podklasie UITableViewCell) z odpowiednikiem edycji multiline UITextView pomocą następujące:

_textView = UITextView.new; 
_textView.font = _label.font; 
_textView.textColor = _label.textColor; 
_textView.textAlignment = _label.textAlignment; 
_textView.backgroundColor = UIColor.clearColor; 
_textView.textContainer.lineFragmentPadding = 0; 
_textView.textContainerInset = UIEdgeInsetsZero; 

i zrobić to dobrze zachowywać, gdy robi rzeczywiste zmiany, należy dodać następujące wpisy do UITextViewDelegate:

- (void)textViewDidChange:(UITextView *)textView 
{ 
    ... 
    [textView scrollRangeToVisible:NSMakeRange(textView.text.length, 0)]; 
    [textView scrollRectToVisible:[textView caretRectForPosition:textView.endOfDocument] animated:NO]; 
}