#ios #uitableview #ios7 #autolayout
#iOS #uitableview #ios7 #автозаполнение
Вопрос:
Это сводит меня с ума. У меня есть tableview с простой UILabel в каждой ячейке вверху и строкой изображений внизу. Вот так:
Вот часть кода, который у меня есть для контроллера TableView:
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
// This project has only one cell identifier, but if you are have more than one, this is the time
NSString *reuseIdentifier = cellIdentifier;
MyCell *cell = [self.offscreenCells objectForKey:reuseIdentifier];
if (!cell) {
cell = [[MyCell alloc] init];
[cell setDelegate:self];
[self.offscreenCells setObject:cell forKey:reuseIdentifier];
}
[cell.titleLabel setText:@"UILabel - I want it smaller (wrapped)"];
NSString *url = @"http://assets.bizjournals.com/seattle/news/soccer ball square*304.jpg?v=1";
[self.imageView1 loadImageForURLString:url];
[self.imageView2 loadImageForURLString:url];
[self.imageView3 loadImageForURLString:url];
[self.imageView4 loadImageForURLString:url];
// Make sure the constraints have been added to this cell, since it may have just been created from scratch
[cell setNeedsUpdateConstraints];
[cell updateConstraintsIfNeeded];
cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));
// Do the layout pass on the cell, which will calculate the frames for all the views based on the constraints
[cell setNeedsLayout];
[cell layoutIfNeeded];
// Get the actual height required for the cell
CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
// Add an extra point to the height to account for the cell separator, which is added between the bottom
// of the cell's contentView and the bottom of the table view cell.
height = 1;
return height;
}
И вот некоторый соответствующий код в моей ячейке tableview:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
[self.titleLabel setLineBreakMode:NSLineBreakByTruncatingTail];
[self.titleLabel setNumberOfLines:1];
[self.titleLabel setTextAlignment:NSTextAlignmentCenter];
[self.titleLabel setTextColor:[UIColor blackColor]];
[self.imagesView addSubview:self.titleLabel];
[self.imagesView addSubview:self.imageView1];
[self.imagesView addSubview:self.imageView2];
[self.imagesView addSubview:self.imageView3];
[self.imagesView addSubview:self.imageView4];
[self.contentView addSubview:self.titleLabel];
[self.contentView addSubview:self.imagesView];
self.contentView.backgroundColor = [UIColor whiteColor];
[self.titleLabel setBackgroundColor:[UIColor greenColor]];
[self.imagesView setBackgroundColor:[UIColor blueColor]];
[self.contentView setNeedsLayout];
[self.contentView layoutIfNeeded];
}
return self;
}
- (void)updateConstraints
{
[super updateConstraints];
if (self.didSetupConstraints) {
return;
}
[UIView autoSetPriority:UILayoutPriorityRequired forConstraints:^{
[self.titleLabel autoSetContentCompressionResistancePriorityForAxis:ALAxisVertical];
}];
[self.titleLabel autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
[self.titleLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets];
[self.titleLabel autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:kLabelHorizontalInsets];
[UIView autoSetPriority:UILayoutPriorityRequired forConstraints:^{
[self.imagesView autoSetContentCompressionResistancePriorityForAxis:ALAxisVertical];
}];
[self.imagesView autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationLessThanOrEqual];
[self.imagesView autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:0 relation:NSLayoutRelationEqual];
[self.imagesView autoPinEdgeToSuperviewEdge:ALEdgeTrailing withInset:0 relation:NSLayoutRelationEqual];
[self.imagesView autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:0];
NSArray *subviews = @[self.imageView1, self.imageView2, self.imageView3, self.imageView4, self.imageView5];
[self.imageView1 autoMatchDimension:ALDimensionHeight toDimension:ALDimensionWidth ofView:self.imageView1];
[subviews autoMatchViewsDimension:ALDimensionHeight];
[subviews autoDistributeViewsAlongAxis:ALAxisHorizontal withFixedSpacing:10.0f insetSpacing:NO alignment:NSLayoutFormatAlignAllCenterY];
[subviews autoMatchViewsDimension:ALDimensionHeight];
[self.imageView1 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
[self.imageView2 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
[self.imageView3 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
[self.imageView4 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
[self.imageView5 autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.titleLabel withOffset:kLabelVerticalInsets relation:NSLayoutRelationEqual];
// Pin the images in the container so they appear
[self.imageView1 autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:0];
[self.imageView1 autoPinEdgeToSuperviewEdge:ALEdgeBottom withInset:0];
self.didSetupConstraints = YES;
}
- (void)layoutSubviews
{
[super layoutSubviews];
// Make sure the contentView does a layout pass here so that its subviews have their frames set, which we
// need to use to set the preferredMaxLayoutWidth below.
[self.contentView setNeedsLayout];
[self.contentView layoutIfNeeded];
self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.frame);
}
Итак, мой вопрос таков: почему UILabel не переносит мой текст? Правильно ли я закрепляю представления?
Комментарии:
1. С моей точки зрения, вы перезаписали обратный вызов высоты ячейки в uitableviewdelegate, иначе он будет использовать размер ячейки по умолчанию.
2. Почему вы решили создать ячейки в методе: heightForRowInIndexPath вместо переопределения — (NSInteger)TableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger)раздел и — (UITableViewCell *)TableView:(UITableView *)Ячейка TableView forrowatindexpath:(NSIndexPath *)indexPath
3. @Gapp: нет. Как мне переопределить высоту по умолчанию?
4. Вы можете изменить значение по умолчанию на панели свойств TableView в storyboard, если вы делаете все это с помощью кода, переопределяющего функцию делегирования heightForRowInIndexPath . @omegatai