UICollectionView 适配 iPhone 7 Plus

本文介绍如何使用UICollectionView在不同尺寸的iOS设备上展示等宽图片,特别关注了在iPhone 7 Plus上的适配问题。通过调整CollectionView宽度确保图片无缝排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

UICollectionView 适配 iPhone 7 Plus

需求:在屏幕上水平放置 5 张正方形图片,每张图片的宽度相等,无缝隙排列铺满一个屏幕宽度。

看似很简单的需求。用 UICollectionView 实现的话,把 UICollectionView 的宽度设置为屏幕宽度;屏幕宽度除以 5 即为 UICollectionViewCell 的边长,边长也是 UICollectionView 的高度。以下是简单的示例,UICollectionViewCell 不加图片,直接显示背景色。

import UIKit

class ViewController: UIViewController, UICollectionViewDataSource {
    
    // cell 的个数
    private static let itemCountOfRow: Int = 5
    
    // collection view 的宽度
    private static let collectionViewWidth: CGFloat = UIScreen.main.bounds.width
    
    // cell 的边长
    private static let itemWidth: CGFloat = collectionViewWidth / CGFloat(itemCountOfRow)
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let flowLayout = UICollectionViewFlowLayout()
        // cell 的间距为 0
        flowLayout.minimumInteritemSpacing = 0
        flowLayout.minimumLineSpacing = 0
        // cell 的边长为 itemWidth
        let itemWidth = ViewController.itemWidth
        flowLayout.itemSize = CGSize(width: itemWidth, height: itemWidth)
        
        // collectionView 的宽度为 collectionViewWidth
        let collectionView = UICollectionView(frame: CGRect(x: 0,
                                                            y: 100,
                                                            width: ViewController.collectionViewWidth,
                                                            height: itemWidth),
                                              collectionViewLayout: flowLayout)
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
        collectionView.backgroundColor = .clear
        collectionView.dataSource = self
        view.addSubview(collectionView)
    }
    
    // MARK: - Collection view data source
    
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return ViewController.itemCountOfRow
    }
    
    private let cellColors: [UIColor] = [.red, .blue]
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = cellColors[indexPath.item % 2]
        return cell
    }

}

在 iPhone 5s、7 的屏幕上显示正常,例如 5s 的效果

1089786-20170325142749596-1868039745.png

然而,7 Plus 设备就有问题,cell 之间会出现缝隙(下图的白边)

1089786-20170325142840315-985858235.png

先看一下各种设备的屏幕分辨率

1089786-20170325142854205-1494832387.png

屏幕分辨率的单位是 pixel,代码里写的代表屏幕距离的数字,单位是 point。目前(不用考虑非 Retina 屏幕的设备),两者的关系是

// 比 Plus 屏幕小的设备
1 point = 2 pixel

// Plus 设备
1 point = 1080 / 414 pixel = 2.6087 pixel

iPhone SE (与 5s相同)、6s 的屏幕宽度分别为 320、375 point,可以被 5 整除。Plus 设备的屏幕宽度为 414 point,除以 5 为 82.8。如果直接 print 这个相除的结果,得到 82.8,看似没问题。但是,用断点可以看到问题所在

1089786-20170325142911440-586688298.png

UICollectionViewCell 的宽度 itemWidth 为 82.7999…,小于 82.8。也就是说,在 Plus 设备上,cell 的边长比期望的边长小,不能铺满整个屏幕,所以会有缝隙(白边)。

可以有不同的解决方法。比如,可以更换 UICollectionView 的背景色,使缝隙看不出来。这里介绍一种方法:如果屏幕宽度不能被 5 整除,则使 UICollectionView 的宽度稍大于屏幕宽度并且能被 5 整除,这样最后一个 cell 会有一点超出屏幕但又几乎看不出来。Plus 设备的屏幕宽度为 414 point,增加 1 point 即为 415 point,可以被 5 整除;最后一个 cell 超出屏幕 1 point,约为 2.6 pixel,几乎看不出来。具体的代码实现,改变 collectionViewWidth 的值即可。可以判断当前设备是否为 Plus,可以判断屏幕宽度是否为 414,但感觉这些写法不优美。可以按以下修改,兼容所有设备。

private static var collectionViewWidth: CGFloat {
    let cellWidth = UIScreen.main.bounds.width / CGFloat(itemCountOfRow)
    let remaider = cellWidth.truncatingRemainder(dividingBy: 1)
    if remaider > 0 {
        // cell width 不为整数,取大于 cell width 的最小整数作为 cell width
        // 整数 cell width 乘以 cell 的数量为 collection view 的宽度
        return (CGFloat(Int(cellWidth)) + 1) * CGFloat(itemCountOfRow)
    }
    // cell width 为整数,可以用屏幕宽度作为 collection view 的宽度
    return UIScreen.main.bounds.width
}

修改后,7 Plus 的效果

1089786-20170325142923158-2095819207.png

转载请注明出处:http://www.cnblogs.com/silence-cnblogs/p/6617066.html

转载于:https://www.cnblogs.com/silence-cnblogs/p/6617066.html

内容概要:本文探讨了在MATLAB/SimuLink环境中进行三相STATCOM(静态同步补偿器)无功补偿的技术方法及其仿真过程。首先介绍了STATCOM作为无功功率补偿装置的工作原理,即通过调节交流电压的幅值和相位来实现对无功功率的有效管理。接着详细描述了在MATLAB/SimuLink平台下构建三相STATCOM仿真模型的具体步骤,包括创建新模型、添加电源和负载、搭建主电路、加入控制模块以及完成整个电路的连接。然后阐述了如何通过对STATCOM输出电压和电流的精确调控达到无功补偿的目的,并展示了具体的仿真结果分析方法,如读取仿真数据、提取关键参数、绘制无功功率变化曲线等。最后指出,这种技术可以显著提升电力系统的稳定性与电能质量,展望了STATCOM在未来的发展潜力。 适合人群:电气工程专业学生、从事电力系统相关工作的技术人员、希望深入了解无功补偿技术的研究人员。 使用场景及目标:适用于想要掌握MATLAB/SimuLink软件操作技能的人群,特别是那些专注于电力电子领域的从业者;旨在帮助他们学会建立复杂的电力系统仿真模型,以便更好地理解STATCOM的工作机制,进而优化实际项目中的无功补偿方案。 其他说明:文中提供的实例代码可以帮助读者直观地了解如何从零开始构建一个完整的三相STATCOM仿真环境,并通过图形化的方式展示无功补偿的效果,便于进一步的学习与研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值