SwiftUI 从iOS 到 macOS 代码适配

825 阅读3分钟

课程或者工程的情况

1 公司的项目已经是SwiftUI的项目(大部分都死在这,基本都是OC 或者 Swift+RxSwift+ Promise )

2 没有用到现在平台的第三方库,比如weixin 分享的腾讯库,有时候就仅仅有iOS 版本没有macOS 版本(因为这样你无法逾越,靠人家的服务)

3 项目的作者最好还能联系上,因为总会有不是错误提示的错误原因

适配方式情况一 最简单的Color

 Color 的情况每个公司的项目都不同,这个根据公司的项目历史情况不同而不同。

 有一点是这样,有的颜色 就是 iOS没有,Mac 有。苹果的颜色不是通用估计是因为不同设备的用途不同,才有这样区分。

 请参考  mar.codes/apple-color…

 这里很明显说明了系统自带的颜色 因为平台不同而名称不同。

 如果真的不按照苹果设计规范要按照公司的设计规范,个人感觉这种最直观

image.png  

 特别是多人合作的时候,颜色是最容易变成重复劳动的无用工

image.png


.frame(width: 750, height: 400)

            .background(

                Color("bgColor")

            )

            .cornerRadius(16)

            .shadow(radius: 10,x: 5,y:5)

        }

遇到UIColor

typealias UIColor = NSColor

这里说明: 文字的字体,颜色 都是同样的套路

适配中遇到UIKit


typealias UIImageView = NSImageView

typealias UIImage = NSImage

typealias UIColor = NSColor
typealias UIDevice = Host

typealias UIScreen = NSScreen

这里推荐如果之前是项目中大部分是SwiftUI 偶尔遇到个UIKit 的可以用这个,如果大部分是UIKit 偶尔是SwiftUI 不推荐。这个看项目的具体比例来制定不同的方案。

有一种情况如果把代码都改为同一种框架来适配,可能更节约时间。设置有的情况是把iPhone版本放大到pad版本来进行适配,因为之前项目已经很庞大了人员不够。(baidu网盘,微信读书等)

 

封装 如何优雅的适配

这个我参考了 斯坦福大学CS193p

最后一课的思路,对于iOS 和mac 是在是不能合二为一的情况,自己也想避免写宏定义来 写一堆IF ELSE


    if #available(iOS 15.0, *) {

        

    } else {

        

    }


extension NSScreen {

    static var scale:CGFloat {

      return  NSScreen.main?.backingScaleFactor as? CGFloat ?? 0

    }

    static var bounds: CGRect  {

        return  NSScreen.main?.visibleFrame ?? CGRect()

    }


结语

对于全平台的开发 是个可遇不可求的机会如果在公司。

对于我们普通小小iOS开发不能左右公司的项目的布局,但是秉承学习尝试的观点。

可以尝试最少的代码进行最多功能实现。

提高效率的同时减少bug。

swiftui 的各种刷新机制想逃离掉第三方的RX系列和Promise系列的库,和SwiftUI一起合用来减少代码的库依赖和更容易上手写带有状态变化的UI。

如果也有对macos 开发有兴趣 可以从这里开始

apple dev macos 开发官方文档