UITableViewCells之间的间距

我在swift中创build一个ios应用程序,并希望在Facebook(pic bellow)之类的单元格之间添加空格。

我正在使用自定义笔尖的post。 我知道使用UITableViewController。 我想我会使用一个分隔符样式,但它没有达到效果。 我瞪着几个小时,并没有find一个快速的教程,这是有道理的! 有人可以解释一下,他们是如何在应用程序中使用swift? 谢谢!

在这里输入图像说明

使用Swift 2,你可以这样做UITableViewCells之间的间距:

在你的TableViewController中复制这个:

// In this case I returning 140.0. You can change this value depending of your cell override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 140.0 } override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { cell.contentView.backgroundColor = UIColor.clearColor() let whiteRoundedView : UIView = UIView(frame: CGRectMake(0, 10, self.view.frame.size.width, 120)) whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), [1.0, 1.0, 1.0, 1.0]) whiteRoundedView.layer.masksToBounds = false whiteRoundedView.layer.cornerRadius = 2.0 whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1) whiteRoundedView.layer.shadowOpacity = 0.2 cell.contentView.addSubview(whiteRoundedView) cell.contentView.sendSubviewToBack(whiteRoundedView) } 

这是结果:

在这里输入图像说明

这是我的解决scheme,结果:(根据乔治Casariego的答案)

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomApplicationCell cell.contentView.backgroundColor = UIColor.clear let whiteRoundedView : UIView = UIView(frame: CGRectMake(10, 8, self.view.frame.size.width - 20, 149)) whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), [1.0, 1.0, 1.0, 0.8]) whiteRoundedView.layer.masksToBounds = false whiteRoundedView.layer.cornerRadius = 2.0 whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1) whiteRoundedView.layer.shadowOpacity = 0.2 cell.contentView.addSubview(whiteRoundedView) cell.contentView.sendSubviewToBack(whiteRoundedView) return cell } 

表行高度:165点

标题部分高度,页脚部分高度:10点

和结果

在这里输入图像说明

编辑Swift 3语法:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CustomApplicationCell cell.contentView.backgroundColor = UIColor.clear let whiteRoundedView : UIView = UIView(frame: CGRect(x: 10, y: 8, width: self.view.frame.size.width - 20, height: 120)) whiteRoundedView.layer.backgroundColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 1.0, 1.0, 0.9]) whiteRoundedView.layer.masksToBounds = false whiteRoundedView.layer.cornerRadius = 2.0 whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1) whiteRoundedView.layer.shadowOpacity = 0.2 cell.contentView.addSubview(whiteRoundedView) cell.contentView.sendSubview(toBack: whiteRoundedView) return cell } 

以下是将材料卡视图显示的新方法:

创buildCardView.swift

 @IBDesignable class CardView: UIView { @IBInspectable var cornerRadius: CGFloat? = 5 @IBInspectable var shadowOffsetWidth: Int? = 0 @IBInspectable var shadowOffsetHeight: Int? = 2 @IBInspectable var shadowColor: UIColor? = .black @IBInspectable var shadowOpacity: Float? = 0.3 override func layoutSubviews() { layer.cornerRadius = cornerRadius! let shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius!) layer.masksToBounds = false layer.shadowColor = shadowColor?.cgColor layer.shadowOffset = CGSize(width: shadowOffsetWidth!, height: shadowOffsetHeight!); layer.shadowOpacity = shadowOpacity! layer.shadowPath = shadowPath.cgPath } } 

现在只需将CardView类添加到您的UIView。

如果你想拥有正确/合法的空间,而不是一个窍门,你可以尝试UICollectionView而不是UITableView。

UICollectionView比UITableView更通用,你可以定制几乎所有的东西。

我做了UITableViewCell的一个子类和一个nib文件去。 将一个UIView拖到单元格的contentView中,并将其与contentView设置为相同的大小。 这将充当一个容器,并成为“新”contentView。 你可以把你需要的东西放在那里,就像你通常在UITableViewCell的contentView中一样。

现在,您可以调整容器视图的高度,在单元格的底部留下所需的间距。 最后,将contentView的背景颜色更改为clearColor ,即可完成效果。

Jorge Casariego的Objective-C版本Swift代码:

 //play with the 'y' parameter of the whiteRoundedView to change the spacing -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.contentView.backgroundColor = [UIColor colorWithRed:225/255.0 green:225/255.0 blue:225/255.0 alpha:1.0]; UIView *whiteRoundedView = [[UIView alloc]initWithFrame:CGRectMake(5, 2, self.view.frame.size.width-10, cell.contentView.frame.size.height)]; CGFloat colors[]={1.0,1.0,1.0,1.0};//cell color white whiteRoundedView.layer.backgroundColor = CGColorCreate(CGColorSpaceCreateDeviceRGB(), colors); whiteRoundedView.layer.masksToBounds = false; whiteRoundedView.layer.cornerRadius = 5.0; whiteRoundedView.layer.shadowOffset = CGSizeMake(-1, 1); whiteRoundedView.layer.shadowOpacity = 0.2; [cell.contentView addSubview:whiteRoundedView]; [cell.contentView sendSubviewToBack:whiteRoundedView]; } -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { //assign the right cell identifier UITableViewCell *cell = [[self tableView]dequeueReusableCellWithIdentifier:CellIdentifier]; return cell.bounds.size.height; } 

这里有很多正确的答案。

我发现的最简单的方法是在Interface Builder的单元格的contentView中创build一个容器视图。 然后把所有的单元格放在里面,然后限制到那个视图。

根据您的填充要求限制容器视图。

就像是:

在这里输入图像说明

在这里输入图像说明

然后在你的tableViewCellForRow中添加以下内容(假设你的容器视图出口被称为containerView)。

  currentCell.containerView?.layer.cornerRadius = 8 // Your choice here. currentCell.containerView?.clipsToBounds = true 

//添加边框,阴影等,如果你愿意。

好像

圆角

我花了至less一个小时研究这个话题。 最后,我想出了一个使用透明边框的想法:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "faqCell", for: indexPath) // ... cell.layer.borderWidth = CGFloat(TABLE_CELLSPACING) cell.layer.borderColor = tableView.backgroundColor?.cgColor return cell } 

这在Swift 3 / Xcode 8中是完美的。

图片:这是它的样子

这些方法将帮助您实现间距: –

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 15; } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ UIView *invisibleView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds .size.width, 15)]; [invisibleView setBackgroundColor:[UIColor clearColor]]; return invisibleView; } 

有两种可能的解决scheme
1)使用垂直布局的UICollectionView 。 这是非常灵活的解决scheme,你可以写你自己的布局收集。 自定义布局的一些惊人的结果
2)像@sikhapol评论。 但是你会遇到突出显示单元格的问题。 在我的项目中,我创build了content出口视图的普通单元格,女巫包含所有的内容视图。

 class ShadowContentCell: UITableViewCell { @IBOutlet var content: UIView! private var contentBg: UIImageView! private var contentOverlay: UIImageView! required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.frame = super.frame } override func awakeFromNib() { super.awakeFromNib() // custom higlight color selectedBackgroundView = UIView() selectedBackgroundView.backgroundColor = nil contentBg = UIImageView(frame: content.bounds) contentBg.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth contentBg.image = UIImage(color: content.backgroundColor) content.addSubview(contentBg) content.sendSubviewToBack(contentBg) contentOverlay = UIImageView(frame: content.bounds) contentOverlay.autoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth contentOverlay.highlightedImage = UIImage(color: UIColor(white: 0.000, alpha: 0.2)) content.addSubview(contentOverlay) } override func setHighlighted(highlighted: Bool, animated: Bool) { contentOverlay.highlighted = highlighted if animated { let transition = CATransition() transition.duration = 0.3 transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut) transition.type = kCATransitionFade contentBg.layer.addAnimation(transition, forKey: nil) } } override func setSelected(selected: Bool, animated: Bool) { } }