前言
前段时间开发的Widget也上线了,今天总结下开发以来遇到的一些问题。
先附上demo地址[Widget]https://github.com/moneyYouCai/NewWidget-iOS14
问题
-适配问题
上图可以看到Widget在不同分辨率下的尺寸都是不同,宽高比也是完全不同,这让我们的适配就不会特别的准确。
本人在写的时候是用Widget高度为标准来进行简单适配,以宽度为329的组件为1:1适配点,虽然不是特别好的适配方式,但看起来也较为可以,如果大家有其他更好的适配方式欢迎指正学习。
func RatioLen(_ length: CGFloat) -> CGFloat {
if iPhoneHeight == 812 {
return length
}
else if iPhoneHeight == 896 {
return (length * 360 / widgetTargetWidth)
}
else if iPhoneHeight == 736 {
return (length * 348 / widgetTargetWidth)
}
else if iPhoneHeight == 667 {
return (length * 321 / widgetTargetWidth)
}
else if iPhoneHeight == 568 {
return (length * 292 / widgetTargetWidth)
}
return length
}
如果App做了适配ipad,对于Widget来说不同考虑很服,因为苹果对与ipad上显示widget 也和上面尺寸是一样的。
-图片加载问题
Widget中的图片下载是同步下载,如果图片数量过多,则组件页面内容显示会特别慢。如果能在图片加载完之后再去刷新widget,则是一种比较合适的办法。
在这里我说一下思路,大家可以一起参考一下。我们在下载图片的时候运用
DispatchQueue.global(qos: .background).async
当图片下载完之后回到主线程中去刷新Widget
DispatchQueue.main.async {
WidgetCenter.shared.reloadAllTimelines()
}
当然这里要使用一个变量templeImage来判断图片是否加载完成。
-低版本手机打开崩溃问题
这个问题相信大家也都遇到过,在低于iOS14系统的手机上运行会直接崩溃,崩溃原因说是找不到WidgetKit,当然低统是没有WidgetKit这个库的。解决办法其实也很简单,使用canImport,具体代码如下
#if canImport(WidgetKit)
import WidgetKit
#endif
class WidgetReloadData: NSObject {
@objc public func fetch() {
if #available(iOS 14.0, *) {
#if arch(arm64) || arch(i386) || arch(x86_64)
WidgetCenter.shared.reloadAllTimelines()
#endif
}
}
}
接着把WidgetKit.framework的status设置成Optional就可以了-同过Url链接跳转主App崩溃问题
如果url里面有json字符串,直接使用URL(string: url!),一般都会崩溃,需要Encoding
Link(destination: URL(string: url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!)!) {
}
笔者最近也还在研究图片加载以及适配问题,希望能和大家一起学习。