1

我尝试关注 WWCD 2014 session 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


单元格具有固定高度并包含两行文本。看起来像这样:

你好苹果。你好苹果。你好苹果。你好
阿普勒。你好苹果。你好苹果。你好 Apple...


约束和子视图以编程方式添加。模拟器在 Xcode 6.3.1 中运行 iOS 8.3。

4

1 回答 1

1

为了使 UILabel 使用约束,查看Apple 的文档,我认为您需要设置preferredMaxLayoutWidth属性:

当应用布局约束时,此属性会影响标签的大小。在布局期间,如果文本超出此属性指定的宽度,则附加文本将流动到一个或多个新行,从而增加标签的高度。

但是,除非您想要一些特定的单元格自定义,否则您可以使用默认的 UITableViewCell,并numberOfLines = 0在提供的titleLabel. 它可以与 . 一起使用UITableViewAutomaticDimension,尽管我只与heightForRowAtIndexPath:.

更新

根据我所学到的,您还需要在 中设置estimatedRowHeight某些内容viewDidLoad(该值甚至不需要准确/重要)。

这是一个使用默认 UITableViewCells的工作示例:

于 2015-04-25T19:56:32.270 回答