【问题标题】:UICollectionViewFlowLayout minimumLineSpacing not applied to whole collection view - SwiftUICollectionViewFlowLayout minimumLineSpacing 不适用于整个集合视图 - Swift
【发布时间】:2017-01-16 11:34:23
【问题描述】:

我正在为日历创建 UIView 子类,其中带有流式布局的 UICollectionView 用于显示日期。代码是:

    override func draw(_ rect: CGRect)
    {
        super.draw(rect)
        .
        .

        configureCalendarView()
        .
    }



    func configureCalendarView()
    {
        cellWd = Double(self.frame.size.width)/7.0

        let layout = UICollectionViewFlowLayout.init()
        layout.minimumLineSpacing = 0.5
        layout.minimumInteritemSpacing = 0.0
        layout.sectionInset = UIEdgeInsetsMake(1, 0, 0, 0)

        collectionV = UICollectionView.init(frame: CGRect(x: 0, y:90, width:self.frame.size.width, height:CGFloat(cellWd * 5 + 3.5)), collectionViewLayout: layout)
        collectionV?.backgroundColor = self.backgroundColor
        collectionV?.isScrollEnabled = false
        collectionV?.register(DayCell.classForCoder(), forCellWithReuseIdentifier:reuseID)
        collectionV?.dataSource = self;
        collectionV?.delegate = self;
        collectionV?.backgroundColor = calBgColor  //lightgray
        self.addSubview(collectionV!)
    }

一切正常,但最小行距在第 2 行和第 3 行之间没有任何影响。下面是截图:

怎么了?任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: ios swift uicollectionview spacing flowlayout


    【解决方案1】:

    layout.minimumLineSpacing = 0.5 转换为 0.5point * scale = 像素。

    因此,如果您在 iphone 6+ 7+ 上运行 3.0 比例,那么 0.5 将是 1.5 像素。在 2x 比例上,这将是 1 个像素。 纠正这一点。添加这个:

    layout.minimumLineSpacing = 1.0 / [UIScreen mainScreen].scale; 这样你保证总是得到 1 个像素的间距。

    编辑:

    layout.minimumLineSpacing = 1.0f;
    
    CGFloat collectionWidth = self.frame.size.width;
    CGFloat days = 7.0f;
    CGFloat spacing = 1.0f;
    
    CGFloat itemHeight = floorf((collectionWidth/days) - spacing;
    

    【讨论】:

    • CGFloat(cellWd * 5 + 3.5)) 你也必须在这里修正计算,+ 5.0/screenScale
    • 也尝试过改变它,但它只是增加了底部边框,因为collectionview高度增加(背景颜色为浅灰色)
    • 删除你的 layout.sectionInset = UIEdgeInsetsMake(1, 0, 0, 0),让它成为 UIEdgeInsetsZero 。这为您提供了从顶部插入的恒定 1 点(2 像素),这就是为什么它被添加到底部的原因。如果您想要顶部插图,您也需要将其纳入您的计算中。
    • 还是不行^.事实上,如果我将最小行距设置为 1.0,那么行显示为 0.5。因此,如果我将最小行距设置为 0.5,它从 0 开始出现。所以基本上,第二行以下只有 0.5 的差异。
    • 解决了! floor 是关键。只需将 sizeForItemAt 更改为 return CGSize(width:cellWd, height:floor(cellWd) - 0.5) 即可。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-16
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多