2015-04-25 5 views
1

Я попытался следить за сессией WWCD 2014 226, которая представила способ реализовать собственные размеры ячеек в iOS 8 с использованием автоматической компоновки, и она просто не работает должным образом.


HHTableViewCell.hСамостоятельная ячейка для меня просто не работает

#import <UIKit/UIKit.h> 
@interface HHTableViewCell : UITableViewCell 
@property (strong, nonatomic)UILabel *title; 

@end 



HHTableViewCell.m

#import "HHTableViewCell.h" 

@implementation HHTableViewCell 

@synthesize title = _title; 

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // configure control(s) 

#pragma mark -- title Lable 
     _title = [[UILabel alloc] initWithFrame:CGRectInset(self.bounds, 15.0, 0.0)]; 
     _title.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; 
     _title.numberOfLines = 0; 
     [self.contentView addSubview:_title]; 


#pragma mark -- constraints 
     NSMutableArray *constraints = [[NSMutableArray alloc]init]; 
     UIView *contentView = self.contentView; 

     [constraints addObject:[NSLayoutConstraint 
           constraintWithItem:_title 
           attribute:NSLayoutAttributeFirstBaseline 
           relatedBy:NSLayoutRelationEqual 
           toItem:contentView 
           attribute:NSLayoutAttributeTop 
           multiplier:1.8 
           constant:3.0]]; 

     [constraints addObject:[NSLayoutConstraint 
           constraintWithItem:_title 
           attribute:NSLayoutAttributeFirstBaseline 
           relatedBy:NSLayoutRelationEqual 
           toItem:contentView 
           attribute:NSLayoutAttributeTop 
           multiplier:1.8 
           constant:3.0]]; 

     [constraints addObject:[NSLayoutConstraint 
           constraintWithItem:_title 
           attribute:NSLayoutAttributeFirstBaseline 
           relatedBy:NSLayoutRelationEqual 
           toItem:contentView 
           attribute:NSLayoutAttributeTop 
           multiplier:1.8 
           constant:3.0]]; 

     [constraints addObject:[NSLayoutConstraint 
           constraintWithItem:contentView 
           attribute:NSLayoutAttributeHeight 
           relatedBy:NSLayoutRelationGreaterThanOrEqual 
           toItem:nil 
           attribute:0 
           multiplier:1.0 
           constant:44.0]]; 

     [constraints addObjectsFromArray:[NSLayoutConstraint 
              constraintsWithVisualFormat:@"H:|-15-[_title]-15-|" 
              options:0 
              metrics:nil 
              views:NSDictionaryOfVariableBindings(_title)]]; 



     [self.contentView addConstraints:constraints]; 
    } 
    return self; 

} 

@end 



MMTableViewController.h

#import <UIKit/UIKit.h> 

@interface MMTableViewController : UITableViewController 

@end 



MMTableViewController.m

#import "MMTableViewController.h" 
#import "HHTableViewCell.h" 

@interface MMTableViewController() 

@end 

@implementation MMTableViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.tableView registerClass:[HHTableViewCell class] forCellReuseIdentifier:@"HiCell"]; 
    [self.tableView registerClass:[HHTableViewCell class] forCellReuseIdentifier:@"HCell"]; 

    self.tableView.estimatedRowHeight = 44.0; 
    self.tableView.rowHeight = UITableViewAutomaticDimension; 

    // Uncomment the following line to preserve selection between presentations. 
    // self.clearsSelectionOnViewWillAppear = NO; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
#warning Potentially incomplete method implementation. 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
#warning Incomplete method implementation. 
    // Return the number of rows in the section. 
    return 10; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *cellIdentifier = @"HiCell"; 

    HHTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

    cell.title.text = @"Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. Hello Apple. "; 

    // Configure the cell... 
    NSLog(cell.title.text); 

    return cell; 
} 


@end 


Ячейка имеет фиксированную высоту и оборачивать две строки текста. Смотрится:

Hello Apple. Привет, Apple. Привет, Apple. Hello
Aplle. Привет, Apple. Привет, Apple. Привет Apple, ...


Ограничения и подвиды добавляются программно. Симулятор работает под управлением iOS 8.3 в Xcode 6.3.1.

+0

вы не должны использовать Pragma знаки внутри методов.Это просто не выглядит хорошо, и его действительно не предназначено для использования таким образом. Используйте его для группировки нескольких методов – Benzy

+0

, которые не знакомы с использованием знаков прагмы. код выше - всего лишь «копия» сессии 226 WWDC 2014, часть ее может отсутствовать, поэтому я не знаю, правильно ли я ее использую. Спасибо за совет. – MinMKing

+0

Я не знаю, если это ваша проблема, но вы должны установить для свойства titleAutoresizingMaskIntoConstraints значение NO. – rdelmar

ответ

1

Для UILabel работать с ограничениями, глядя на Apple's documentation, я думаю, вам нужно установить preferredMaxLayoutWidth свойство:

Это свойство влияет на размер этикетки, когда ограничения расположения к нему применяются. Во время компоновки, если текст выходит за пределы ширины , указанной этим свойством, дополнительный текст пропускается до одного или новых строк, тем самым увеличивая высоту метки.

Однако, если вы не хотите, чтобы некоторые конкретные ячейки настройки, вы можете использовать по умолчанию UITableViewCell и установите numberOfLines = 0 по прилагаемому titleLabel. Он будет работать с UITableViewAutomaticDimension, хотя я тестировал его только в сочетании с heightForRowAtIndexPath:.

UPDATE:

Из того, что я узнал, вы также должны установить estimatedRowHeight к чему-то в viewDidLoad (значение даже не должна быть точной/важно, кажется).

Here is a working example с использованием по умолчанию UITableViewCells:

+0

Ну, я просто попробовал 'preferredMaxLayoutWidth', но ничего не произошло. Я думаю, что это может быть конфликт сдерживания. Еще благодарю вас за ваш ответ. Просто чувствуйте себя настолько расстроенным из-за всех этих вещей в клетке. – MinMKing

+0

@ Edward90s Я обновил свой ответ с новым намеком: похоже, вам также нужно установить '' 'оцененныйRowHeight'''. Я добавил ссылку на рабочий пример. – Rufel

+0

да, ваш код работает! Нужно что-то изменить, чтобы все было сделано. Удалите эту строку '[self.view addSubview: self.tableView];'. Благодаря! – MinMKing

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