Próbuję nauczyć się automatycznego układu, w końcu pomyślałem, że rozumiem, kiedy to się stało. Gram o prototypowych komórkach i etykietach. Staram się miećAutoLayout multilinalne UILabel odcinające trochę tekstu
- Tytuł,
titleLbl
- niebieskie pole w obrazie - Pieniądze,
moneyLbl
- zielone pole w obrazie - napisów/opis,
subTitleLbl
- czerwone pole w obrazie
Do tej pory mam to:
Co chcę osiągnąć jest:
- Zielona skrzynka powinna zawsze wyświetlane na 1 linię w pełni
- Wartość środku zielonego pola powinny być skoncentrowane na podstawie niebieskim polu
- Niebieska skrzynka odbędzie pozostała przestrzeń (-8px dla ograniczenia poziomego między 2) i wyświetlanie na wielu liniach, jeśli to konieczne
- Czerwone pole powinno znajdować się pod spodem i wyświetlać tyle wierszy, ile potrzeba.
Jak widać, prawie wszystko działa, z wyjątkiem przykładu z ostatniego rzędu. Próbowałem to zbadać i z tego, co mogę zebrać, wynika, że ma to związek z wewnętrzną wielkością treści. Wiele postów poleca online ustawienie setPreferredMaxLayoutWidth
, zrobiłem to w wielu miejscach dla titleLbl
i nie miało to żadnego efektu. Dopiero po zakodowaniu go na 180
otrzymałem wyniki, ale dodałem również białe znaki do innych niebieskich pól na górze/pod tekstem, znacznie zwiększając przestrzeń między czerwonymi i niebieskimi polami.
Oto moje ograniczenia:
Tytuł:
Pieniądze:
Napisy:
podstawie testów Zabrakło mi z innych próbek tekstowych Czyni wydaje się, że używa szerokości, jak pokazano w scenorysie, ale żadna próba jej poprawienia nie działa.
I stworzyli ivar komórki i wykorzystał je do stworzenia wysokości komórki:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
[sizingCellTitleSubMoney.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[sizingCellTitleSubMoney.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[sizingCellTitleSubMoney.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
[sizingCellTitleSubMoney layoutIfNeeded];
CGSize size = [sizingCellTitleSubMoney.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
return size.height+1;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
MATitleSubtitleMoneyTableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifierTitleSubTitleMoney];
if(!cell)
{
cell = [[MATitleSubtitleMoneyTableViewCell alloc] init];
}
cell.titleLbl.layer.borderColor = [UIColor blueColor].CGColor;
cell.titleLbl.layer.borderWidth = 1;
cell.subtitleLbl.layer.borderColor = [UIColor redColor].CGColor;
cell.subtitleLbl.layer.borderWidth = 1;
cell.moneyLbl.layer.borderColor = [UIColor greenColor].CGColor;
cell.moneyLbl.layer.borderWidth = 1;
[cell.titleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"title"]];
[cell.subtitleLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"subtitle"]];
[cell.moneyLbl setText:[[tableViewData objectAtIndex:indexPath.row] objectForKey:@"cost"]];
return cell;
}
próbowałem zachodzącego setPreferredMaxLayoutWidth
wewnątrz komórki za subviews układ:
- (void)layoutSubviews
{
[super layoutSubviews];
NSLog(@"Money lbl: %@", NSStringFromCGRect(self.moneyLbl.frame));
NSLog(@"prefferredMaxSize: %f \n\n", self.moneyLbl.frame.origin.x-8);
[self.titleLbl setPreferredMaxLayoutWidth: self.moneyLbl.frame.origin.x-8];
}
dziennika :
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] Money lbl: {{209, 20}, {91, 61}}
2014-04-30 21:37:32.475 AutoLayoutTestBed[652:60b] prefferredMaxSize: 201.000000
Czego się bym nie spodziewał, ponieważ między 2 elementami występuje 8px i konsola to weryfikuje.Działa to doskonale w pierwszym rzędzie, bez względu na to, ile tekstu dodaję do niebieskiego pudełka, które jest takie samo, jak scenorys, ale jakikolwiek wzrost do zielonego pudełka powoduje odrzucenie obliczenia szerokości. Próbowałem ustawić to w tableView:willDisplayCell
i tableView:heightForRowAtIndexPath:
, jak również na podstawie odpowiedzi z innych pytań. Ale bez względu na to, co po prostu nie układa.
Każda pomoc, pomysły i uwagi będą bardzo mile widziane
dzięki za wejście, ale przykro mi, nie, to jest daleko. Problem (zgodnie z moją odpowiedzią) polega na tym, że używałem pozycji "X" z zielonej etykiety, zanim zielona etykieta została rozciągnięta, aby pasowała do jej treści. W przypadku używania etykiet wielowierszowych w większości przypadków należy ustawić opcję 'setPreferredMaxLayoutWidth', aby obliczyć tę wartość dla koloru niebieskiego, muszę obliczyć wyświetlaną szerokość zieleni. Po ustawieniu ustalono prawidłową wysokość. –