在 IOS 8 中使用自动布局调整单元格大小

Posted

技术标签:

【中文标题】在 IOS 8 中使用自动布局调整单元格大小【英文标题】:Cell Resizing using Autolayout in IOS 8 【发布时间】:2015-02-05 14:50:46 【问题描述】:

我试图使用内容大小调整单元格的大小,但我知道在 ios 8 中您可以使用自动布局调整单元格的大小。我尝试了同样的方法,但我无法获得确切的用户界面。我在 UIView 控制器中有一个 TableView。这是我的代码 viewcontroller.m :-

@implementation MessageViewController
@synthesize  messageTable;
- (void)viewDidLoad 
    self.messageTable.estimatedRowHeight = 70.0;
    self.messageTable.rowHeight = UITableViewAutomaticDimension;

   [super viewDidLoad];


  if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
      self.edgesForExtendedLayout = UIRectEdgeNone;
  self.navigationController.toolbarHidden=NO;
  _txtField=[[UITextView alloc] initWithFrame:CGRectMake(40, 5, 220, 30)];
  [_txtField setFont:[UIFont systemFontOfSize:15]];
  _txtField.layer.cornerRadius = 7.0;
  _txtField.clipsToBounds = YES;

  _txtField.text=@"Hello";



[self.navigationController.toolbar addSubview:_txtField];
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Send" forState:UIControlStateNormal];
button.frame = CGRectMake(265.0, 5, 50.0, 30.0);

[self.navigationController.toolbar addSubview:button];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]

                               initWithTarget:self
                               action:@selector(dismissKeyboard)];

[self.view addGestureRecognizer:tap];


// table view data is being set here
_messageArray = [[NSMutableArray alloc]initWithObjects:
           @"Data 2 ",@"Data 1 Data 1Data 1Data 1Data 1Data 1Data 1Data     1Data 1D",@"Data 8 ",
               @"Data 9 ", nil];
     [self.messageTable reloadData];

// Do any additional setup after loading the view.

用户界面看起来像这样:-

标签的限制是:-

需要帮助:)

编辑:-

细胞

【问题讨论】:

为什么不在 heightForRowAtIndexPath 中计算每一行的高度?? 我想在单元格中添加更多元素,例如 UIImage 等。自动布局可以很容易地提供间距和边距,这就是我使用自动布局的原因。 Autolayout 可以帮助您在单元格内组织视图,并且在heightForRowAtIndexPath: 中设置高度将使视图布局考虑到单元格视图的大小。因此,例如,您的边距空间仍将使用您的约束正确完成。 我并不是说不要使用 Autolayout,但是如果你实现 heightForRowAtIndexPath 并计算你的高度,你会得到更好的结果。如果我从您所说的内容中理解,您需要的唯一计算是标签的高度。 恐怕我不明白预期的输出是什么意思或确切的问题是什么。是标签的大小不正确(您是否更改了它的背景颜色以检查它是否正在调整大小)还是正在绘制太多单元格?您还没有添加任何 tableview 委托方法,所以我假设您已经检查过每个方法都返回了正确的值。最后,您是否尝试过视图调试器(如果您认为这是错误的,请检查单元格中的约束)? 【参考方案1】:

http://www.appcoda.com/self-sizing-cells/ 您可以尝试此链接以仅在 ios 8 中自动调整标签大小。

并且不要忘记在您的 viewdidload 中添加以下行。

tableView.estimatedRowHeight = 44.0
tableView.rowHeight = UITableViewAutomaticDimension

【讨论】:

【参考方案2】:

Swift 最简单的解决方案。展开选定的单元格,折叠所有其他单元格。

在调用开始/结束更新时通知表格视图单元格大小:

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    let selectedIndex = tableView.indexPathForSelectedRow
    let cellHeight: CGFloat
    if indexPath == selectedIndex 
      cellHeight = 150
     else 
      cellHeight = 50
    

    return cellHeight

点击单元格时触发开始/结束更新:

  override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    print("selected row: \(indexPath.row)")

    tableView.beginUpdates()
    //will trigger cell resizing
    tableView.endUpdates()
  

【讨论】:

以上是关于在 IOS 8 中使用自动布局调整单元格大小的主要内容,如果未能解决你的问题,请参考以下文章

使用自动布局进行编辑时在表格视图中调整子视图的大小

在 IOS Objective C 中,如何让单元格自动调整其子 UITableView 的内容大小

无法使用自动布局将简单的自行调整大小的集合视图单元格调整为标签大小

使用自动布局约束动态调整表格视图单元格的大小

在 UICollectionView 中自动调整单元格(全部在代码中)

如何使用自动布局来调整表格视图单元格中的视图大小?