Tôi đang cố gắng tìm hiểu bố cục tự động, cuối cùng nghĩ rằng tôi đã nhận được treo trên nó khi điều này xảy ra. Tôi đang chơi về với các tế bào nguyên mẫu và nhãn. Tôi đang cố gắng để có một Tiêu đềAutoLayout multiline UILabel cắt bỏ một số văn bản
- ,
titleLbl
- hộp màu xanh trong ảnh - Money,
moneyLbl
- hộp màu xanh lá cây trong ảnh - Subtitle/mô tả,
subTitleLbl
- hộp màu đỏ trong hình ảnh
Cho đến nay tôi có điều này:
.210Những gì tôi muốn đạt được là:
- Hộp màu xanh lá cây nên luôn luôn hiển thị trên 1 dòng đầy đủ
- Giá trị bên trong hộp màu xanh lá cây nên được tập trung dựa trên các hộp màu xanh
- Hộp xanh sẽ mất khoảng trống còn lại (-8px cho giới hạn ngang giữa 2) và hiển thị trên nhiều dòng nếu cần
- Hộp màu đỏ phải ở dưới và hiển thị nhiều dòng nếu cần.
Như bạn có thể thấy điều này gần như tất cả đang hoạt động, ngoại trừ ví dụ ở hàng cuối cùng. Tôi đã cố gắng nghiên cứu này và từ những gì tôi có thể thu thập nó là một cái gì đó để làm với kích thước nội dung nội tại. Nhiều bài đăng trực tuyến khuyên bạn nên đặt setPreferredMaxLayoutWidth
, tôi đã thực hiện việc này ở nhiều nơi cho số titleLbl
và nó không có hiệu lực. Chỉ khi hardcoding nó để 180
tôi đã nhận được kết quả, nhưng nó cũng thêm khoảng trắng/padding cho các hộp màu xanh khác trên đầu/bên dưới văn bản, làm tăng đáng kể không gian giữa các hộp màu đỏ/xanh.
Dưới đây là những hạn chế của tôi:
Title:
Money:
Subtitle:
Dựa trên các bài kiểm tra tôi đã chạy với mẫu văn bản khác nó dường như đang sử dụng chiều rộng như được hiển thị trong bảng phân cảnh, nhưng bất kỳ nỗ lực sửa lỗi nào đều không hoạt động.
Tôi đã tạo ra một Ivar của tế bào và sử dụng nó để tạo ra chiều cao của tế bào:
- (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;
}
Tôi đã thử đặt setPreferredMaxLayoutWidth
bên subviews bố trí của tế bào:
- (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];
}
log :
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
Tôi mong đợi điều gì khi có 8px giữa 2 yếu tố và giao diện điều khiển xác minh điều này.Nó hoạt động hoàn hảo trên hàng đầu tiên cho dù có bao nhiêu văn bản tôi thêm vào hộp màu xanh, giống như bảng phân cảnh, nhưng bất kỳ sự gia tăng nào vào hộp màu xanh lá cây đều làm giảm tính toán chiều rộng. Tôi đã thử đặt cài đặt này trong số tableView:willDisplayCell
và tableView:heightForRowAtIndexPath:
cũng dựa trên câu trả lời từ các câu hỏi khác. Nhưng không có vấn đề gì nó chỉ không bố trí.
Bất kỳ sự giúp đỡ, ý tưởng hay ý kiến sẽ được đánh giá rất
cảm ơn đầu vào, nhưng tôi xin lỗi vì không có cách nào khác. Vấn đề (như được nêu trong câu trả lời của tôi) là nó đang sử dụng vị trí 'X' từ nhãn màu xanh lá cây trước khi nhãn màu xanh lá cây được kéo dài ra để vừa với nội dung của nó. Khi sử dụng các nhãn nhiều dòng trong hầu hết các trường hợp, bạn cần đặt 'setPreferredMaxLayoutWidth', tôi cần tính toán độ rộng được hiển thị của màu xanh lục để tính giá trị này cho màu xanh lam. Một khi đã được thiết lập, nó đã tìm ra chiều cao chính xác –