代码之家  ›  专栏  ›  技术社区  ›  Peter Rowell

如何在分组样式的UITableView中设置单元格宽度

  •  106
  • Peter Rowell  · 技术社区  · 5 年前

    我已经为此工作了大约2天,所以我想我应该和你分享我的学习成果。

    问题是:是否可以使分组的UITableView中的单元格宽度变小?

    答案是:不。

    但有两种方法可以解决这个问题。

    解决方案1:更薄的桌子 可以更改TableView的框架,使表变小。这将导致uiTableView以减小的宽度呈现单元内部。

    解决方案如下:

    -(void)viewWillAppear:(BOOL)animated
    {
        CGFloat tableBorderLeft = 20;
        CGFloat tableBorderRight = 20;
    
        CGRect tableRect = self.view.frame;
        tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
        tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
        tableView.frame = tableRect;
    }
    

    解决方案2:通过图像呈现单元格

    此解决方案描述如下: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html

    我希望这些信息对你有帮助。我花了大约2天时间尝试了很多可能性。这就是剩下的。

    7 回复  |  直到 7 年前
        1
  •  225
  •   an0    13 年前

    实现这一点的一个更好和更清洁的方法是子类化UITableViewCell并重写其 -setFrame: 方法如下:

    - (void)setFrame:(CGRect)frame {
        frame.origin.x += inset;
        frame.size.width -= 2 * inset;
        [super setFrame:frame];
    }
    

    为什么更好?因为其他两个更糟。

    1. 调整表格视图宽度 -viewWillAppear:

      首先,这是不可靠的,超级视图或父视图控制器可以在 -视图将出现: 被称为。当然,您可以子类化和重写 -框架: 对于您的uiTableView,就像我在这里对uiTableView单元格所做的一样。然而,子类化uitableviewcells是一种非常常见的、轻量级的和Apple的方法。

      其次,如果您的UITableView有BackgroundView,则不希望将其BackgroundView缩小到一起。保持BackgroundView宽度的同时缩小UITableView宽度并不是一件微不足道的工作,更不用说将子视图扩展到它的超级视图之外并不是一件非常优雅的事情。

    2. 自定义单元格呈现以模拟更窄的宽度

      要做到这一点,您必须准备具有水平边距的特殊背景图像,并且您必须自己布局单元格的子视图以适应边距。 相比之下,如果您只是调整整个单元格的宽度,那么自动调整大小将为您完成所有工作。

        2
  •  12
  •   JuJoDi    9 年前

    要在不提供设置变量方法的swift中执行此操作,必须重写 frame . 最初发布(至少在我找到它的地方) here

    override var frame: CGRect {
        get {
            return super.frame
        }
        set (newFrame) {
            let inset: CGFloat = 15
            var frame = newFrame
            frame.origin.x += inset
            frame.size.width -= 2 * inset
            super.frame = frame
        }
    }
    
        3
  •  9
  •   includeMe    14 年前

    如果什么都不起作用,你可以试试这个

    将单元格的背景色设置为清晰的颜色,然后将单元格的图像设置为所需大小。如果要在该单元格上显示一些文本,请在图像上方放置一个标签。别忘了将标签的背景色也设置为透明色。

        4
  •  8
  •   Graham    9 年前

    我发现公认的解决方案在轮换时不起作用。为了实现具有固定宽度和灵活页边距的uiTableViewCells,我将上述解决方案调整为:

    - (void)setFrame:(CGRect)frame {
    
        if (self.superview) {
            float cellWidth = 500.0;
            frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2;
            frame.size.width = cellWidth;
        }
    
        [super setFrame:frame];
    }
    

    每当设备旋转时都会调用该方法,因此单元格始终居中。

        5
  •  0
  •   Guy    7 年前

    有一个方法在旋转屏幕时调用:viewwillTransitionOnSize

    这是调整框架大小的地方。参见示例。根据需要更改帧坐标。

    - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
    {
        [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
        {
            int x = 0;
            int y = 0;
            self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height);
        }];
    }
    
        6
  •  -2
  •   Lều Đức Quý    8 年前

    我在里面做

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell;
        CGFloat tableBorderLeft = self.view.frame.origin.x + 10;
        CGFloat tableBorderRight = self.view.frame.size.width - 20;
    
        CGRect tableRect = self.view.frame;
        tableRect.origin.x = tableBorderLeft; 
        tableRect.size.width = tableBorderRight; 
        tableView.frame = tableRect;
    }
    

    这对我很有用

        7
  •  -6
  •   bharath gangupalli    8 年前

    在.h文件中添加委托“UITableViewDataSource”

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    { 
        return size;
    }