如何以分组样式设置UITableView中单元格的宽度
我已经为此工作了大约2天,所以我想我与你分享我的学习。
问题是:是否有可能使分组的UITableView单元格的宽度更小?
答案是不。
但是有两种方法可以解决这个问题。
解决scheme#1:一个更薄的表可以改变tableView的框架,以便表更小。 这将导致UITableView呈现宽度减小的单元格。
对此的解决scheme可能如下所示:
-(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; }
解决scheme#2:通过图像渲染单元格
这个解决scheme在这里描述: http : //cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
我希望这些信息对你有帮助。 我花了大约2天的时间尝试了很多可能性。 这是剩下的。
一个更好,更干净的方式来实现这一点是-setFrame:
UITableViewCell并重写其-setFrame:
方法是这样的:
- (void)setFrame:(CGRect)frame { frame.origin.x += inset; frame.size.width -= 2 * inset; [super setFrame:frame]; }
为什么更好? 因为另外两个更糟。
-
在
-viewWillAppear:
调整表格视图的宽度-viewWillAppear:
首先,这是不可靠的,超视图或父视图控制器可以在调用之后进一步调整表视图框架。 当然,你可以为你的UITableView子类和覆盖
-setFrame:
就像我在这里为UITableViewCells所做的一样。 但是,UITableViewCells的子类化是一个非常普遍的,轻量的,苹果的方式。其次,如果你的UITableView有backgroundView,你不希望它的backgroundView缩小在一起。 保持backgroundView的宽度,同时缩小UITableView宽度不是微不足道的工作,更不用说扩大子视图超越其超视图是不是一个非常优雅的事情要做的第一位。
-
自定义单元格渲染伪造更窄的宽度
为此,您必须准备具有水平边距的特殊背景图像,并且必须自己布局单元格子视图以适应边距。 相比之下,如果你只是调整整个单元格的宽度,自动调整将为你做所有的工作。
如果没有任何作品,你可以试试这个
将单元格的背景色设置为清晰的颜色,然后放置所需大小的单元格的图像。 如果您想在该单元上显示一些文字,请在图像上方放置一个标签。 不要忘了设置标签的背景颜色以清除颜色。
要在Swift中做到这一点,它不提供方法来设置variables,你必须重写frame
的setter。 最初张贴(至less在哪里find它) 在这里
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 } }
我发现接受的解决scheme没有旋转工作。 为了实现具有固定宽度和灵活边距的UITableViewCells,我只是将上述解决scheme调整为以下内容:
- (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]; }
每当设备旋转时该方法被调用,所以单元将始终居中。
在屏幕旋转时会调用一个方法:viewWillTransitionToSize
这是你应该调整框架的地方。 看例子。 根据需要更改框架坐标。
- (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); }]; }
我这样做
- (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; }
这对我有用
在.h文件中添加委托'UITableViewDataSource'
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return size; }