如何在UICollectionView单元格中获得1个像素宽的边框?(提供的代码)

Gre*_*reg 13 uitableview uiview ios uicollectionview uicollectionviewlayout

如何在UICollectionView中获得带有边框线的像素完美的一(1)像素(例如,制作月历).问题在于细胞相遇,它们的边界相遇,所以它实际上是2个像素(不是1个像素).

因此,这是与CollectionView布局相关的问题/问题.正如每个单元格所拥有的方式一样,当单元格全部满足零间距时,会出现1像素边框,整体看起来像2像素边框(除了collectionView的外边缘,这将是1像素)

寻求使用什么方法/代码来解决这个问题.

这是我使用的自定义UICollectionViewCell类,我使用drawrect将边框放在这里的单元格上.

import UIKit

class GCCalendarCell: UICollectionViewCell {

    @IBOutlet weak var title : UITextField!

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    override func drawRect(rect: CGRect) {
        self.layer.borderWidth = 1
        self.layer.borderColor = UIColor.redColor().CGColor
    }

}
Run Code Online (Sandbox Code Playgroud)

Ant*_*tox 8

您可以采取一些策略来解决此问题.哪个最好取决于您的布局的一些细节.

选项1:半边界

在每个项目周围绘制所需宽度的1/2边框.有人建议这样做.它实现了项目之间边框的正确宽度,但是集合边缘周围的边框也将是所需宽度的一半.要解决此问题,您可以在整个集合或部分周围绘制边框.

如果你是月份布局只渲染给定月份的天数,意味着每个月都有一个独特的非矩形形状,修复边缘边框比它的价值更复杂.

选项2:重叠单元格

绘制每个项目周围的完整边框,但调整框架使它们重叠边框宽度的一半,从而隐藏冗余.

这是最简单的策略并且效果很好,但请注意以下几点:

  • 请注意布局的外边缘也略有变化.必要时补偿.
  • 边框将重叠,因此您不能使用半透明边框.
  • 如果不是所有边框都是相同的颜色,则会丢失一些边缘.如果只有一个单元格具有不同的边框,则可以调整项目的z-index以使其位于其他单元格之上.

选项3:手动绘图

您可以在容器周围添加边框,然后在超级视图中手动绘制边框,而不是在单元格上使用边框.这可以通过覆盖drawRect(_:)和使用UIBezierPaths在单元格的间隔处绘制水平和垂直线来实现.这是最手动的选择.它可以让您获得更多控制权,但需要更多工作.

选项4:在每个单元格中仅绘制一些边框

不是指定图层的边框宽度和边框颜色(在整个视图周围绘制边框),而是选择性地绘制单元格的边缘.例如:每个单元格只能绘制它的底部和右边缘,除非上面或右边没有单元格.

如果您有不规则网格,这可能会再次导致并发症.它还要求每个单元格了解网格中需要更多结构的上下文.如果你走这条路线,我会建议继承UICollectionViewLayoutAttributes并添加关于应该绘制哪些边的附加信息.边缘绘制本身可以通过为每个边创建UIBezierPath's in 来完成drawRect(_:).