5

Mam problem z uzyskiwanie spójne wyniki z UITextViews w UITableViewCell przy użyciu NSAttributStrings.Jak konsekwentnie rysować NSAttributedString w UITextView w UITableViewCell

wewnątrz - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

    headerText = [[UITextView alloc]initWithFrame:CGRectZero]; 
    [headerText setUserInteractionEnabled:NO]; 
    headerText.tag = HEADER_TEXT; 
    [cell.contentView addSubview:headerText]; 
} else { 
    headerText = (UITextView*)[cell.contentView viewWithTag:HEADER_TEXT]; 
} 

//...setting up attributed strings 


[headerText setAttributedText:headerString]; 

CGSize headerSize = [headerText sizeThatFits:CGSizeMake(246, CGFLOAT_MAX)]; 

headerText.frame = CGRectMake(45, 8, headerSize.width, headerSize.height); 

Wyniki:

Before Scrolling No contentinset

jak można zobacz, pierwsze dwa wydają się rysować tekst w sposób, jakiego oczekiwałbym/chciałbym. W dwóch ostatnich przypadkach metoda UITextView sizeThatFits zwraca znacznie większy rozmiar, a następnie jest wymagana do narysowania tekstu, a tekst zostaje wyśrodkowany w ramce, a następnie ciasno do górnej krawędzi ramki. Jest to problem, ponieważ chcę móc układać inne widoki na podstawie wysokości ramki uitextview.

po przewinięciu z ramą iz powrotem w: enter image description here

Teraz robi się jeszcze dziwniej, gdy komórki są ponownie wykorzystywane, a przypisać ciąg jest ponownie ustawiony. uitextview rysuje tekst w niekonsekwentny sposób.

Nawet Ustawianie contentInsets do

headerText.contentInset = UIEdgeInsetsMake(-8, -8, -8, -8); 

Nie dostarczenie jakichkolwiek spójnych wyników:

enter image description here

i po Przewijanie z zestawem contentinset: enter image description here

istnieją inne atrybuty w UITextView, które pozwoliłyby mi uzyskać zachowanie th w razie potrzeby?

Odpowiedz

8

Podczas ustawiania przypisać ciąg z UITextView, który wcześniej miał inny nadany ciąg, należy zawsze ustawić wszystkie właściwości związane łańcuchową w UITextView do nil pierwszy, np:

self.tv.text = nil; 
self.tv.font = nil; 
self.tv.textColor = nil; 
self.tv.textAlignment = NSTextAlignmentLeft; 
self.tv.attributedText = s2; 

W przeciwnym razie, jak masz odkryte, stare funkcje poprzedniego przypisanego ciągu nadal pozostają w zawieszeniu i wpływają na nowy przypisany ciąg znaków.

Ogólnie, muszę powiedzieć, że nie widzę powodu, dla którego w ogóle korzystasz z UITextView. Jeśli nie potrzebujesz, aby użytkownik mógł edytować te przypisane łańcuchy, użyj UILabel lub po prostu narysuj bezpośrednio przypisany ciąg, aby uzyskać jak najdokładniejsze renderowanie. NSAttributedString daje ci całą moc, której potrzebujesz do zmierzenia rozmiaru i narysowania w tym rozmiarze.

+0

Używam UITextView, ponieważ implementuje on protokół UITextInput. Co pozwala mi tworzyć przyciski nad pewnymi podciągami tekstu. Przyznaję, że bezpośrednie rysowanie tekstu byłoby korzystne. Jakie biblioteki iOS powinienem zagłębić, aby to osiągnąć? Jeszcze raz dziękuję za odpowiedź na pytanie. –

+0

Do rysowania tekstu nie są potrzebne "biblioteki". To część UIKit. – matt

+0

Myślę, że być może będę musiał użyć CoreText, aby móc określić, czy dotknięcie dotarło nad linią lub tekstem. –