SwiftyWalkthrough 是一个用于在您的应用中创建出色的引导体验的库,它用 Swift 编写。您可以使用此库允许用户以由您控制的预定方式逐步导航和探索您的应用程序。
SwiftyWalkthrough 在Insane Logic 开发。
SwiftyWalkthrough 通过在屏幕顶部添加覆盖层,阻止对您的视图的访问来实现。然后您可以控制哪些视图应该被允许访问以及何时访问。
import SwiftyWalkthrough
if let _ = walkthroughView {
// Attached to existing walkthrough
} else {
let myCustomWalkthrough = CustomWalkthroughView()
startWalkthrough(myCustomWalkthrough)
// Walkthrough initialized
}
有时判断是否存在正在进行的引导非常有用(即调整视图控制器上的逻辑)。在这种情况下,您可以使用属性 ongoingWalkthrough
。
@IBAction func switchValueChanged(sender: UISwitch) {
customWalkthroughView?.removeAllHoles()
customWalkthroughView?.helpLabel.hidden = true
NSUserDefaults.standardUserDefaults().setBool(true, forKey: "settingsWalkthroughComplete")
if ongoingWalkthrough {
navigationController?.popToRootViewControllerAnimated(true)
}
}
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var surnameField: UITextField!
@IBOutlet weak var addressField: UITextField!
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
walkthroughView?.cutHolesForViews([nameField]) // start by only allowing the interaction with nameField
}
cutHolesForViews
只会在您的视图的框架中查看,以在覆盖层中挖洞。如果您想添加一些额外的填充或定义圆角半径,可以使用 cutHolesForViewDescriptors
如下所示
let descriptors = [
ViewDescriptor(view: showProfileButton, extraPaddingX: 20, extraPaddingY: 10, cornerRadius: 10)
]
walkthroughView?.cutHolesForViewDescriptors(descriptors)
walkthroughView?.removeAllHoles()
finishWalkthrough()
默认情况下,SwiftyWalkthrough仅提供阻止访问你的视图并切开口以访问它们的机制,如何自定义以满足您的需求就取决于您了。您可以通过继承WalkthroughView
来操作,并使用您自定义的引导视图启动引导。您可以在随库提供的示例中了解更多信息。
import UIKit
import SwiftyWalkthrough
class CustomWalkthroughView: WalkthroughView {
// customize it
}
let myCustomWalkthrough = CustomWalkthroughView()
startWalkthrough(myCustomWalkthrough)
在任意时间指定覆盖层的暗色色调,只需设置属性dimColor
walkthroughView?.dimColor = UIColor.redColor().colorWithAlphaComponent(0.7).CGColor
如果您需要通知您在立即要与暴露视图交互之前的情况,可以为willInteractWithView
方法提供实现。
// MARK: - WalkthroughViewDelegate
func willInteractWithView(view: UIView) {
print("Will interact with view \(view)")
}
注意:请记住,willInteractWithView
可能会被多次调用,因为它依赖于UIView的hitTest
方法。请参考UIView类参考
该方法通过调用每个子视图的点Inside:withEvent:方法遍历视图层次结构,以确定哪个子视图应该接收触摸事件。如果点Inside:withEvent:返回true,则类似地遍历子视图的层次结构,直到找到包含指定点的最前面视图。如果一个视图不包含该点,其视图层次结构的这个分支将被忽略。您很少需要自己调用此方法,但您可能需要重写它以隐藏子视图的触摸事件。
此方法忽略隐藏的视图对象,没有启用用户交互的视图对象,或其alpha小于0.01的视图对象。在确定命中时,此方法不考虑视图的内容。因此,即使指定的点在该视图内容的透明部分内,该视图仍然可以返回。
如果点位于接收器的边界之外,则永远不会报告为命中,即使它们实际上位于接收器的某个子视图内。如果当前视图的clipsToBounds属性设置为false并且受影响的子视图超出视图的界限,则可能会发生这种情况。
告诉我,我会在这里提到!
由Rui Costa (@ruipfcosta) 拥有和维护。
感谢Andrew Jackman (@andrew_jackman)。
欢迎提交错误报告和拉取请求。
SwiftyWalkthrough 根据 MIT 许可证发布。请参见 LICENSE 以获取详细信息。