2015-02-07 2 views
1

Я пытаюсь программно создать пользовательский UITableViewCell, без XIB, который состоит из одного UILabel, который использует Auto Layout для указания высоты ячейки. Я присвоил этим меткам ведущие, конечные, верхние и нижние ограничения для ячейки contentView, но эти ограничения не влияют на высоту ячейки таблицы. Этикетки все сложены друг над другом без заполнения, а разделители строк таблицы не совпадают с метками. В чем проблема?Подкласс UITableViewCell с ограничениями автоматической компоновки

enter image description here

Пользовательские ячейки:

@interface TransactionTableViewCell() 

@property (nonatomic, assign) BOOL didUpdateConstraints; 

@end 


@implementation TransactionTableViewCell 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 

    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { 
     self.translatesAutoresizingMaskIntoConstraints = NO; 

     self.transactionPriceLabel = [[UILabel alloc] init]; 
     self.transactionPriceLabel.backgroundColor = [UIColor yellowColor]; 
     self.transactionPriceLabel.translatesAutoresizingMaskIntoConstraints = NO; 
     [self.contentView addSubview:self.transactionPriceLabel]; 
    } 

    [self setNeedsUpdateConstraints]; //had to add this otherwise updateConstraints isn't called for some reason 

    return self; 

} 

- (void)updateConstraints { 
    if (!self.didUpdateConstraints) { 
     self.didUpdateConstraints = YES; 

     [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.transactionPriceLabel 
                    attribute:NSLayoutAttributeTrailing 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeTrailing 
                    multiplier:1 
                     constant:-15]]; 
     [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.transactionPriceLabel 
                    attribute:NSLayoutAttributeTop 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeTop 
                    multiplier:1 
                     constant:15]]; 
     [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.transactionPriceLabel 
                    attribute:NSLayoutAttributeBottom 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeBottom 
                    multiplier:1 
                     constant:15]]; 
     [self.contentView addConstraint:[NSLayoutConstraint constraintWithItem:self.transactionPriceLabel 
                    attribute:NSLayoutAttributeLeading 
                    relatedBy:NSLayoutRelationEqual 
                     toItem:self.contentView 
                    attribute:NSLayoutAttributeLeading 
                    multiplier:1 
                     constant:15]]; 
    } 

    [super updateConstraints]; 
} 

View Controller:

- (void)viewDidLoad { 
    UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
    tableView.dataSource = self; 
    tableView.delegate = self; 
    tableView.rowHeight = UITableViewAutomaticDimension; 
    tableView.estimatedRowHeight = 44.0; 
    [self.view addSubview:tableView]; 

    tableView.translatesAutoresizingMaskIntoConstraints = NO; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:tableView 
                attribute:NSLayoutAttributeLeading 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeLeading 
                multiplier:1 
                 constant:0]]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:tableView 
                attribute:NSLayoutAttributeTop 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeTop 
                multiplier:1 
                 constant:0]]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:tableView 
                attribute:NSLayoutAttributeBottom 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeBottom 
                multiplier:1 
                 constant:0]]; 
    [self.view addConstraint:[NSLayoutConstraint constraintWithItem:tableView 
                attribute:NSLayoutAttributeTrailingMargin 
                relatedBy:NSLayoutRelationEqual 
                 toItem:self.view 
                attribute:NSLayoutAttributeTrailingMargin 
                multiplier:1 
                 constant:0]]; 

    [tableView registerClass:[TransactionTableViewCell class] forCellReuseIdentifier:@"cell"]; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    TransactionTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath]; 

    cell.transactionPriceLabel.text = @"label text"; 
    cell.transactionPriceLabel.textColor = [UIColor redColor]; 

    return cell; 
} 

ответ

1

Константа в нижней части этикетки на нижней части contentView ограничение должно быть -15, не 15.

+0

Хороший глаз! Ничего себе это было так просто. – Joey

Смежные вопросы