SPStorkController
关于
类似于 Apple Music、播客和 Mail 应用中的 Controller。如果您需要自定义高度或在 iOS 12 中支持模态样式,请查阅。
只需简单添加关闭按钮和居中箭头指示器。可自定义高度。使用自定义 TransitionDelegate
。
您可以在 SPAlert 项目中找到 Alert,它支持多种预设,并且部分为可动效设置。
如果您喜欢这个项目,请别忘了为其 点星 ★
并在 GitHub 上关注我。
导航
需求
Swift 4.2
& 5.0
。适用于 iOS 10+
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。有关用法和安装说明,请访问他们的网站。要将 SPStorkController
集成到您的 Xcode 项目中,使用 CocoaPods,在您的 Podfile
中指定它。
pod 'SPStorkController'
Carthage
Carthage 是一个去中心化的依赖管理器,它会为您构建依赖并提供二进制框架。要将 SPStorkController
集成到您的 Xcode 项目中,使用 Carthage,在您的 Cartfile
中指定它。
github "ivanvorobei/SPStorkController"
Swift 包管理器
Swift 包管理器 是一个管理 Swift 代码分发工具。它与 Swift 构建系统集成,以自动处理下载、编译和链接依赖项的过程。
要使用 Xcode 11 集成 SPStorkController
到您的 Xcode 项目中,请到 项目 > Swift 包
中指定它。
https://github.com/varabeis/SPStorkController
手动
如果您不希望使用上述依赖管理器之一,可以将 SPStorkController
手动集成到项目中。将 Source/SPStorkController
文件夹放入您的 Xcode 项目中。请确保启用 如果需要则复制项目
和 创建组
。
快速开始
创建控制器并调用 presentAsStork
函数
import UIKit
import SPStorkController
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let controller = UIViewController()
self.presentAsStork(controller)
}
}
如果需要自定义控制器(移除指示器,设置自定义高度等),创建控制器并将 transitioningDelegate
设置为 SPStorkTransitioningDelegate
对象。使用 present
或 dismiss
函数
let controller = UIViewController()
let transitionDelegate = SPStorkTransitioningDelegate()
controller.transitioningDelegate = transitionDelegate
controller.modalPresentationStyle = .custom
controller.modalPresentationCapturesStatusBarAppearance = true
self.present(controller, animated: true, completion: nil)
请不要这样初始化 SPStorkTransitioningDelegate
controller.transitioningDelegate = SPStorkTransitioningDelegate()
您将收到有关弱属性的错误。
用法
浅色状态栏
要为呈现的控制器设置浅色状态栏,请使用 preferredStatusBarStyle
属性。还要设置 modalPresentationCapturesStatusBarAppearance
。请参阅示例
import UIKit
class ModalViewController: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
}
自定义高度
customHeight
属性设置控制器的高度。默认为 nil
transitionDelegate.customHeight = 350
关闭按钮
属性 showCloseButton
添加了一个带有 dismiss 作用的圆形按钮。默认为 false
transitionDelegate.showCloseButton = false
箭头指示器
您可以在控制器的顶部添加可动画状态的箭头指示器。它简单配置。属性 showIndicator
显示或隐藏顶部箭头指示器。默认为 true
transitionDelegate.showIndicator = true
indicatorColor
属性用于自定义箭头的颜色。默认为 gray
transitionDelegate.indicatorColor = UIColor.white
属性hideIndicatorWhenScroll
用于在滚动时显示或隐藏指示器。默认值为false
transitionDelegate.hideIndicatorWhenScroll = true
您可以设置始终显示行或箭头指示器。设置indicatorMode
transitionDelegate.indicatorMode = .alwaysLine
取消确认
还可以配置将使控制器消失的事件。属性swipeToDismissEnabled
通过滑动手势启用消失。默认值为true
transitionDelegate.swipeToDismissEnabled = true
属性translateForDismiss
设置需要向下滑动多少才能关闭控制器。仅在swipeToDismissEnabled
为真时起作用。默认值为240
transitionDelegate.translateForDismiss = 100
属性tapAroundToDismissEnabled
通过点击父控制器启用消失。默认值为true
transitionDelegate.tapAroundToDismissEnabled = true
圆角
属性cornerRadius
用于自定义控制器视图的圆角。默认值为10
transitionDelegate.cornerRadius = 10
触觉反馈
属性hapticMoments
允许为某些时刻添加触觉反馈。默认值为.willDismissIfRelease
transitionDelegate.hapticMoments = [.willPresent, .willDismiss]
快照
项目使用屏幕快照来避免兼容性和定制问题。在控制器展示之前,对父视图进行快照,并改变大小和位置。有时您需要更新父视图的快照,为此使用静态函数
SPStorkController.updatePresentingController(modal: controller)
并传递控制器,该控制器是模态的,并使用SPStorkTransitioningDelegate
。
如果父控制器正在滚动且您尝试显示SPStorkController
,您将看到它冻结,然后在一秒钟后更新其最终位置。建议在展示SPStorkController
之前停止滚动强制。
scrollView.setContentOffset(self.contentOffset, animated: false)
导航栏
您可能想为您的模态控制器添加一个导航栏。由于在 Swift 4 中更改或自定义原生的控制器变得不可能(我甚至找不到更改导航栏高度的途径),我不得不从零开始重新创建导航栏。从视觉上看它看起来很真实,但并没有执行必要的功能。
import UIKit
import SPFakeBar
class ModalController: UIViewController {
let navBar = SPFakeBarView(style: .stork)
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.white
self.navBar.titleLabel.text = "Title"
self.navBar.leftButton.setTitle("Cancel", for: .normal)
self.navBar.leftButton.addTarget(self, action: #selector(self.dismissAction), for: .touchUpInside)
self.view.addSubview(self.navBar)
}
}
您只需将导航栏添加到主视图中,它将自动布局。在 SPFakeBarView
的初始化中设置样式 .stork
。以下是带有导航栏和没有导航栏的视觉预览。
要使用它,您需要安装 SPFakeBar pod。
pod 'SPFakeBar'
与 UIScrollView 的交互
如果您在控制器上使用了 UIScrollView
(或 UITableView & UICollectionView),我建议使其更加交互式。当滚动到达顶部位置时,控制器将交互式地拖动下来,模拟关闭动画。您还可以通过在 UIScrollView
上拖动下来来关闭控制器。要做到这一点,设置委托并在函数 scrollViewDidScroll
中调用
func scrollViewDidScroll(_ scrollView: UIScrollView) {
SPStorkController.scrollViewDidScroll(scrollView)
}
与 UITableView & UICollectionView 的交互
与集合类交互并不难。您可以在 Example
文件夹中找到一个实现示例。然而,我会给一些建议,让表格看起来更美观。
首先,如果您使用了 SPFakeBarView
,请记得设置内容与滚动指示器的顶部缩进。我还建议设置底部缩进(这是可选的)
tableView.contentInset.top = self.navBar.height
tableView.scrollIndicatorInsets.top = self.navBar.height
请也在滚动委托中使用 SPStorkController.scrollViewDidScroll
函数以获得与集合或表格视图的更多互动。
在关闭前确认
要使用滑动关闭,点击周围,关闭按钮和指示器,使用 SPStorkControllerConfirmDelegate
。实现协议
@objc public protocol SPStorkControllerConfirmDelegate: class {
var needConfirm: Bool { get }
func confirm(_ completion: @escaping (_ isConfirmed: Bool)->())
}
并将 confirmDelegate
属性设置为实现了协议的对象。如果 needConfirm
返回 true,则调用 confirm
函数。传递 isConfirmed
与结果。最佳选项是使用具有 .actionSheet
样式的 UIAlertController
以进行确认。
如果您使用自定义按钮,在目标中使用以下代码
SPStorkController.dismissWithConfirmation(controller: self, completion: nil)
它调用 confirm
函数并检查确认的结果。有关更多详细信息,请参阅示例项目。
委托
您可以通过实现 SPStorkControllerDelegate
并为 transitionDelegate
设置委托来检查事件
transitionDelegate.storkDelegate = self
委托具有以下功能:
protocol SPStorkControllerDelegate: class {
optional func didDismissStorkBySwipe()
optional func didDismissStorkByTap()
}
故事板
如果您需要使用故事板与 SPStorkController
,请将类 SPStorkSegue
设置为在故事板文件中的过渡设置。我将提供类代码以便您了解它的作用。
import UIKit
class SPStorkSegue: UIStoryboardSegue {
public var transitioningDelegate: SPStorkTransitioningDelegate?
override func perform() {
transitioningDelegate = transitioningDelegate ?? SPStorkTransitioningDelegate()
destination.transitioningDelegate = transitioningDelegate
destination.modalPresentationStyle = .custom
super.perform()
}
}
打开您的故事板,选择过渡并打开右侧菜单。打开 属性检查器
并在类部分插入 SPStorkSegue
。
其他控制器的模态展示
若要在 SPStorkController
上展示模态控制器,请设置
controller.modalPresentationStyle = .custom
这有助于正确展示和移除所有模态控制器。
在iOS 13中的表单
Apple 在 WWDC 2019
上推出了新的模态展示风格 - 表单
。它支持交互式关闭并可与导航栏一起使用。自iOS 13起可用。当我对它进行更详细的研究时,我将添加更多信息。您可以在此处查看展示。
其他项目
SPAlert
您可以在AppStore收到反馈或添加歌曲到Apple音乐的库后找到这些提醒。包含流行的“完成”、“喜欢”预设以及许多其他预设。"完成"预设带有类似原始的绘制路径动画。还有简单不带图标的消息提示。一行代码即可使用。
SPPerspective
iOS 14的部件动画。3D转换与动态阴影。请查看视频预览。提供深入的3D和阴影定制。您还可以使用不带动画的静态转换。
SPPermissions
用于请求和检查权限状态。提供请求多个权限的本机UI。简单集成和使用,如2行代码。
SPDiffable
简化对表格和集合中动画变化的处理。Apple的diffable API需要为每种对象类型实现模型。如果您想在许多地方使用它,需要花费时间实现并处理重复代码。该项目通过共享模型和特殊单元格提供程序以优雅地完成此操作。支持iOS14的侧边栏,并且已经提供了本机单元格提供程序和视图。
SparrowKit
用于提升开发能力的原生Swift扩展集合。支持tvOS和watchOS。
针对俄语社区
俄语社区
我在" код воробей "的 Telegram 频道上发表关于 iOS 开发的文章。视频教程发布在 YouTube