相关疑难解决方法(0)

UITableView灵活/动态heightForRowAtIndexPath

案件

通常,您将使用cellForRowAtIndexPath委托方法来设置您的单元格.为单元格设置的信息对于单元格的绘制方式以及大小的大小非常重要.

不幸的是,在heightForRowAtIndexPath委托方法之前调用cellForRowAtIndexPath委托方法,因此我们不能简单地告诉委托返回单元格的高度,因为那时它将为零.

因此,我们需要在表格中绘制单元格之前计算大小.幸运的是,有一种方法可以实现sizeWithFont,它属于NSString类.然而,存在问题,为了动态地计算正确的大小,它需要知道如何呈现单元中的元素.我将在一个例子中说明这一点:

想象一下UITableViewCell,它包含一个名为的标签textLabel.在cellForRowAtIndexPath我们放置的委托方法中textLabel.numberOfLines = 0,它基本上告诉标签它可以具有尽可能多的行以呈现特定宽度的文本.如果我们为textLabel提供一个大于最初赋予textLabel的宽度的文本,则会出现问题.第二行将出现,但单元格的高度不会自动调整,因此我们得到一个混乱的查看表视图.

正如前面所说的,我们可以用sizeWithFont计算出的高度,但它需要知道使用哪种字体,为,什么宽度等.如果,为了简单起见,我们只关心宽度,我们可以硬编码的宽度将约为320.0(不考虑填充).但是如果我们使用UITableViewStyleGrouped而不是普通的宽度那么将会发生大约300.0并且单元格将再次混乱.或者如果我们从纵向交换到横向,我们有更多的空间,但由于我们硬编码300.0,它将不会被使用.

在这种情况下,你必须问自己一个问题,你可以避免多少硬编码.

我自己的想法

您可以调用cellForRowAtIndexPath属于UITableView类的方法来获取特定节和行的单元格.我读了几篇帖子说你不想那样做,但我真的不明白.是的,我同意它已经分配了单元格,但heightForRowAtIndexPath委托方法只调用可见的单元格,因此无论如何都将分配单元格.如果正确使用,dequeueReusableCellWithIdentifier则不会在cellForRowAtIndexPath方法中再次分配单元格,而是使用指针并仅调整属性.那有什么问题呢?

请注意,单元格未在cellForRowAtIndexPath委托方法中绘制,当表格视图单元格变为可见时,脚本将调用setNeedDisplayUITableVieCell上的drawRect方法,该方法将触发绘制单元格的方法.所以cellForRowAtIndexPath直接调用代理不会失去性能,因为它需要被绘制两次.

好的,通过在cellForRowAtIndexPath委托方法中调用heightForRowAtIndexPath委托方法,我们可以获得有关单元格的所有信息,以确定它的大小.

也许你可以创建自己的sizeForCell方法来运行所有选项,如果单元格是Value1样式,或者Value2,等等.

结论/问题

这只是我在思想中描述的理论,我想知道我写的是不是正确的.或者也许还有另一种方法来完成同样的事情.请注意,我希望能够尽可能灵活地做事.

iphone uitableview

60
推荐指数
3
解决办法
3万
查看次数

如何计算通过cellForRowAtIndexPath中的开关设置的单元格的heightForRowAtIndexPath.

我设置我的单元格如下:

因此,一些开关定义单元格,因为数据不在对象列表中,而是一组信息,应以某种不同的方式显示在tableView中.

-(UITableViewCell *)value1CellForTableView:(UITableView *)tableView {
    static NSString *CellIdentifierValue1 = @"Value1Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifierValue1];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifierValue1];
        cell.detailTextLabel.textAlignment = UITextAlignmentLeft;
        cell.textLabel.textAlignment = UITextAlignmentLeft;
    }
    return cell;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = nil;

    switch (indexPath.section) {
        case 0:
            //Coupon
            switch (indexPath.row) {
                case 0:
                    //Couponcode
                    cell = [self value1CellForTableView:tableView];
                    cell.textLabel.text = @"Code";
                    cell.detailTextLabel.text = presentedCoupon.couponNr;
                    break;
                case 1:
                    //Coupondescription
                    cell = [self value1CellForTableView:tableView];
                    cell.detailTextLabel.text = …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c uitableview ios

3
推荐指数
1
解决办法
7906
查看次数

标签 统计

iphone ×2

uitableview ×2

ios ×1

objective-c ×1