Маркировки, выравнивающиеся в UITableViewCell

Используйте реальный двухфакторная аутентификация для предотвращения единственной зависимости от паролей, которые могли бы быть сохранены в значительно большем количестве мест, чем кэш браузера пользователя.

20
задан Igor 15 July 2009 в 16:07
поделиться

3 ответа

Каким бы ни был размер ячеек, вы должны сделать это с помощью различных методов определения размера NSString. Таким образом, вы можете точно определить высоту ячейки и избежать пробелов.

1
ответ дан 29 November 2019 в 23:41
поделиться

Ну, это стоило мне дня, но я думаю, что разобрался. Насколько я могу судить, это похоже на ошибку в том, как UITableViewCell выкладывает textLabel и detailTextLabel. Когда вы устанавливаете высоту строки, кажется, что для двух меток назначается равная высота, что означает, что вы получаете именно то поведение, которое вы видите выше, хотя для detailTextLabel требуется больше места. Вот две вещи, которые я сделал, чтобы решить эту проблему. Мне пришлось создать подкласс UITableViewCell, чтобы исправить это, но это минимальный объем кода.

Во-первых, убедитесь, что вы правильно рассчитываете высоту каждой строки. Поместите этот метод в делегат табличного представления. Замените методы шрифта своими:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSString *cellDetailText = [[self itemForIndexPath: indexPath] detailDescription];
   NSString *cellText = [[self itemForIndexPath: indexPath] description];
   // The width subtracted from the tableView frame depends on:
   // 40.0 for detail accessory
   // Width of icon image
   // Editing width
   // I don't think you can count on the cell being properly laid out here, so you've
   // got to hard code it based on the state of the table.
   CGSize constraintSize = CGSizeMake(tableView.frame.size.width - 40.0 - 50.0, CGFLOAT_MAX);
   CGSize labelSize = [cellText sizeWithFont: [self cellTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];
   CGSize detailSize = [cellDetailText sizeWithFont: [self cellDetailTextLabelFont] constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

   CGFloat result = MAX(44.0, labelSize.height + detailSize.height + 12.0); 
   return result;
}

Затем создайте подкласс UITableViewCell и переопределите layoutSubviews:

#import "UITableViewCellFixed.h"


@implementation UITableViewCellFixed
- (void) layoutSubviews {
   [super layoutSubviews];
   self.textLabel.frame = CGRectMake(self.textLabel.frame.origin.x, 
                                      4.0, 
                                      self.textLabel.frame.size.width, 
                                      self.textLabel.frame.size.height);
   self.detailTextLabel.frame = CGRectMake(self.detailTextLabel.frame.origin.x, 
                                           8.0 + self.textLabel.frame.size.height, 
                                           self.detailTextLabel.frame.size.width, 
                                           self.detailTextLabel.frame.size.height);
}
@end
36
ответ дан 29 November 2019 в 23:41
поделиться

Если окажется, что textLabel и detailTextLabel размещены с использованием масок автоизменения размеров, возможно, вы сможете сделать это при возврате ячейки:

cell.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
cell.detailTextLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Если это сработает, это немного проще, чем создание подкласса ячейки. Но я не пробовал.

-2
ответ дан 29 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: