仿微信ActionSheet
V2EX项目中使用了一个类似微信的弹窗,抽时间将其重构了下做了一个小开源库。
用法也很简单,类似UIAlertController
一样,添加具体的Action,然后直接show就行了。更多用法可以参考 Sample
let actionSheet = WXActionSheet(cancelButtonTitle: "取消")
actionSheet.add(WXActionSheetItem(title: "发送给朋友", handler: { _ in
}))
actionSheet.add(WXActionSheetItem(title: "收藏", handler: { _ in
}))
actionSheet.add(WXActionSheetItem(title: "保存图片", handler: { _ in
}))
actionSheet.add(WXActionSheetItem(title: "删除", handler: { _ in
}, type: .destructive))
actionSheet.show()
原理也相对比较简单,看代码就能懂。遇到的一些坑是将这个View添加到哪个层级上。一开始使用的是 keyWindow
,发现当页面显示有异常。然后使用的是 UIApplication.shared.windows.last
,发现当页面上有WKWebView
时,聚焦WebView后,弹窗就显示不出来。利用Xcode的截图功能看了下,发现最上层的Window是UIRemoteKeyboardWindow
。
最后使用的是
let windows = UIApplication.shared.windows.filter { NSStringFromClass($0.classForCoder) != "UIRemoteKeyboardWindow" }
guard let win = windows.last else { return }
找到不是UIRemoteKeyboardWindow
的最上层的一个window
。