开发遇到的问题

159 阅读6分钟

Swift开发遇到的问题

1、主工程和CocoaPods模块中的.bundle文件、.xcassets文件,以及.xcassets最终打出的ipa包是什么样的资源文件

当你在Xcode项目中处理资源时,无论是通过主工程或CocoaPods模块,资源的最终形式在打包成.ipa文件后有所不同。这取决于资源是如何被添加和管理的(如.bundle文件、.xcassets)。下面详细解释这些资源在.ipa包中的形式。

  1. .bundle文件

无论是在主工程中还是CocoaPods模块中,.bundle文件保持其文件夹结构,作为资源容器存在。在.ipa包内,这些.bundle文件将按照它们在项目中的路径被复制过去。这意味着,如果你有一个名为MyBundle.bundle的资源包,它将直接作为一个单独的文件夹出现在.ipa文件中的相应位置。

  1. .xcassets文件

.xcassets文件夹是一种包含图像和其他资源(如颜色集、数据集)的资源目录。在编译过程中,Xcode会将.xcassets中的资源编译成一个优化过的资源文件Assets.car。这个文件包含了所有的资源数据,经过压缩和可能的格式转换,以提高运行时的性能和效率。

.ipa包中的资源文件:

主工程的.xcassets: 所有从主工程的.xcassets编译出来的资源都会被合并到一个或多个Assets.car文件中,这些文件位于.ipa包的Payload/YourApp.app/目录下。
CocoaPods模块的.xcassets: 如果你的CocoaPods模块中包含.xcassets,这些资源也会被编译成一个或多个Assets.car文件,通常这些资源会被合并到主工程的资源文件中,除非在Podspec中特别指定了资源包。如果指定了资源包,这些资源可以编译到单独的Assets.car文件中,并存放在相应的.bundle目录下。
结论

在.ipa包中,.bundle文件保持其目录结构,而所有.xcassets资源被编译并压缩成Assets.car文件。这种处理方式优化了应用的性能,减少了资源的加载时间,并可能减小了应用的总体大小,因为Assets.car文件是为效率优化的。理解这些机制有助于更好地管理项目中的资源,并优化应用的性能和体积。

2、图片资源放到.bundle文件中和放到.xcassets中的对比

在iOS开发中,图片资源可以存放在.bundle文件中或者.xcassets目录中。下面是两者的对比,包括优点和缺点:

1、图片资源存放在.bundle文件中

优点:
独立性: .bundle文件可以作为一个独立的资源包,方便在不同的项目之间共享或复用。
版本管理: 可以单独对.bundle文件进行版本控制,便于管理和更新。
灵活性: 可以在不修改主项目的情况下,替换或更新.bundle中的资源。
多项目共享: 适用于多个项目共享同一套资源,如字体、图标等。

缺点:
加载效率: 相比于.xcassets,.bundle中的图片可能需要额外的文件系统操作来加载,可能会影响性能。
管理复杂: 需要手动管理.bundle文件,包括添加、删除和更新资源。
不支持Asset Catalog特性: .bundle不支持.xcassets的一些特性,如图片集(Image Set)、颜色集(Color Set)和自动缩放等。

2、图片资源存放在.xcassets目录中

优点:

集成性: 图片资源直接集成在项目中,便于管理和维护。
性能优化: Xcode会对.xcassets中的图片进行优化,包括压缩和缓存,提高加载效率。
自动缩放: 支持为不同屏幕尺寸和分辨率提供不同大小的图片,如@2x、@3x。
资源管理: 支持图片集、颜色集等,便于组织和管理多种资源。
支持特性: 支持App Thinning,减少最终用户的下载大小。

缺点:

共享限制: 资源集成在项目中,不便于在多个项目之间共享。
版本控制: 所有资源都包含在项目中,可能会增加版本控制系统的负担。
更新不便: 如果需要更新资源,可能需要重新编译整个项目。

总结:

选择将图片资源放在.bundle文件中还是.xcassets目录中,取决于你的项目需求和资源管理策略。如果你需要跨项目共享资源,或者需要对资源进行独立管理,.bundle可能是一个好选择。如果你更关注性能优化和资源管理的便捷性,.xcassets会是更好的选择。在实际开发中,可以根据具体情况灵活选择。

3、LaunchScreen.storyboard一直加载缓存图片?

LaunchScreen.storyboard中的图片我替换了,缓存也清理了,但是真机运行的时候,一直加载缓存的图片
解决办法:
将LaunchScreen.storyboard中用到的图片,不要放到Assets.xcassets中,直接放到主工程的某个图片文件夹下

4、UITextView加载html字符串有哪些限制?

5、UIView设置部分圆角的另一种方式

 view.layer.cornerRadius = 8
 view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
 view.layer.borderWidth = 1
 view.layer.borderColor = UIColor.white.cgColor
 view.layer.masksToBounds = true

6、zRatio适配屏幕宽度

有一个工具方法zRatio,传入任何值,都可以根据屏幕宽度进行适配

// 将传入的参数乘以375屏幕比例
public func zRatio(_ x:CGFloat) -> CGFloat {
    return x * (UIScreen.main.bounds.width / 375.0)
}

但是当屏幕左右间距固定的情况时,通过zRatio算出的宽度和预期的左右间距固定,是不一样的,因为zRatio只是乘以了屏幕系数,但是边距也应该同时设置才好使

7、简书markdown图片大小调整

www.jianshu.com/p/fc92459ce…

www.jianshu.com/p/5c1805c6f…

8、UICollectionView水平方向平铺3个Cell,宽度计算问题?

有个需求是,用UICollectionView平铺3个cell,UICollectionView距离屏幕左右间距为0,UICollectionView的sectionInset的左右距离为12,3个cell中间的间距固定8。

正确设置如下:【需要设置layout.minimumLineSpacing】

    private lazy var layout: UICollectionViewFlowLayout = {
        let layout = UICollectionViewFlowLayout()
        // 设置为横向滑动
        layout.scrollDirection = .horizontal
        // section左右距离12
        layout.sectionInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
        // ***注意***因为是水平滑动,所以这里需要设置行间距
        layout.minimumLineSpacing = 8
        return layout
    }()

    func collectionView(_ collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAt indexPath: IndexPath) -> CGSize {
            let margin = layout.sectionInset.left + layout.sectionInset.right
            let space = layout.minimumLineSpacing * 2
            let calWidth = (screenWidth() - 32 - margin - space)/3.0
            return CGSize(width: calWidth, height: 152)
    }

UICollectionView的间距
1)minimumLineSpacing
指的是同一个section内部item的滚动方向的间距,默认值是10

2)minimumInteritemSpacing
表示同一个section内部间item的 和滚动方向垂直方向的间距,默认值是10

竖直方向滚动

竖直方向滚动

水平方向滚动

水平方向滚动