UIViewController

@_spi(FW) extension UIViewController

Navigation

  • 打开控制器。1.如果打开导航栏,则调用present;2.否则如果导航栏存在,则调用push;3.否则调用present

    Declaration

    Swift

    public func fw_open(_ viewController: UIViewController, animated: Bool = true, options: NavigatorOptions = [], completion: (() -> Void)? = nil)
  • 关闭控制器,返回是否成功。1.如果导航栏不存在,则调用dismiss;2.否则如果已是导航栏底部,则调用dismiss;3.否则调用pop

    Declaration

    Swift

    @discardableResult
    public func fw_close(animated: Bool = true, options: NavigatorOptions = [], completion: (() -> Void)? = nil) -> Bool

Workflow

  • 自定义工作流名称,支持二级(“."分隔);默认返回小写类名(去掉ViewController、Controller)

    Declaration

    Swift

    public var fw_workflowName: String { get set }

NavigationController

  • 转场动画自定义判断标识,不相等才会启用转场。默认nil启用转场。可重写或者push前设置生效

    Declaration

    Swift

    public var fw_barTransitionIdentifier: AnyHashable? { get set }
  • 视图控制器是否禁用全屏返回手势,默认NO

    Declaration

    Swift

    public var fw_fullscreenPopGestureDisabled: Bool { get set }
  • 视图控制器全屏手势距离左侧最大距离,默认0,无限制

    Declaration

    Swift

    public var fw_fullscreenPopGestureDistance: CGFloat { get set }

NavigationStyle

  • 状态栏样式,默认preferredStatusBarStyle,设置后才会生效

    Declaration

    Swift

    public var fw_statusBarStyle: UIStatusBarStyle { get set }
  • 状态栏是否隐藏,默认prefersStatusBarHidden,设置后才会生效

    Declaration

    Swift

    public var fw_statusBarHidden: Bool { get set }
  • 当前导航栏设置,优先级高于style,设置后会在viewWillAppear:自动应用生效

    Declaration

    Swift

    public var fw_navigationBarAppearance: NavigationBarAppearance? { get set }
  • 当前导航栏样式,默认default,设置后才会在viewWillAppear:自动应用生效

    Declaration

    Swift

    public var fw_navigationBarStyle: NavigationBarStyle { get set }
  • 导航栏是否隐藏,默认isNavigationBarHidden,设置后才会在viewWillAppear:自动应用生效

    Declaration

    Swift

    public var fw_navigationBarHidden: Bool { get set }
  • 动态隐藏导航栏,如果当前已经viewWillAppear:时立即执行

    Declaration

    Swift

    public func fw_setNavigationBarHidden(_ hidden: Bool, animated: Bool)
  • 是否允许修改导航栏样式,默认未设置时child控制器不能修改

    Declaration

    Swift

    public var fw_allowsBarAppearance: Bool { get set }
  • 标签栏是否隐藏,默认为true,立即生效。如果tabBar一直存在,则用tabBar包裹navBar;如果tabBar只存在主界面,则用navBar包裹tabBar

    Declaration

    Swift

    public var fw_tabBarHidden: Bool { get set }
  • 工具栏是否隐藏,默认为true。需设置toolbarItems,立即生效

    Declaration

    Swift

    public var fw_toolBarHidden: Bool { get set }
  • 动态隐藏工具栏。需设置toolbarItems,立即生效

    Declaration

    Swift

    public func fw_setToolBarHidden(_ hidden: Bool, animated: Bool)
  • 设置视图布局Bar延伸类型,None为不延伸(Bar不覆盖视图),Top|Bottom为顶部|底部延伸,All为全部延伸

    Declaration

    Swift

    public var fw_extendedLayoutEdge: UIRectEdge { get set }
  • 自适应Bar延伸类型,兼容顶部和底部栏safeArea布局方式,需在viewDidLoad及之后调用生效。开启兼容模式时仅在iOS14及以下生效

    Declaration

    Swift

    public func fw_adjustExtendedLayout(compatible: Bool = false)

UIViewController+ViewTransition

  • 视图控制器present|dismiss转场。注意会修改transitioningDelegate,且会强引用之;如需weak引用,请直接设置transitioningDelegate

    Declaration

    Swift

    public var fw_modalTransition: AnimatedTransition? { get set }
  • 视图控制器push|pop转场,代理导航控制器转场,需在fwNavigationTransition设置后生效

    Declaration

    Swift

    public var fw_viewTransition: AnimatedTransition? { get set }
  • 自定义控制器present系统转场(蒙层渐变,内容向上动画),会设置fwModalTransition

    Declaration

    Swift

    @discardableResult
    public func fw_setPresentTransition(_ presentationBlock: ((PresentationController) -> Void)? = nil) -> AnimatedTransition
  • 自定义控制器alert缩放转场(蒙层渐变,内容缩放动画),会设置fwModalTransition

    Declaration

    Swift

    @discardableResult
    public func fw_setAlertTransition(_ presentationBlock: ((PresentationController) -> Void)? = nil) -> AnimatedTransition
  • 自定义控制器fade渐变转场(蒙层和内容渐变动画),会设置fwModalTransition;

    Declaration

    Swift

    @discardableResult
    public func fw_setFadeTransition(_ presentationBlock: ((PresentationController) -> Void)? = nil) -> AnimatedTransition
  • 设置iOS13默认present手势下拉dismiss时的回调block,仅iOS13生效,自动触发,手工dismiss不会触发。会自动设置presentationController.delegate

    Declaration

    Swift

    public var fw_presentationDidDismiss: (() -> Void)? { get set }
  • 自定义控制器popover弹出效果(preferredContentSize设置大小),会自动设置modalPresentationStyle和popoverPresentationController.delegate

    Declaration

    Swift

    public func fw_setPopoverPresentation(_ presentationBlock: ((UIPopoverPresentationController) -> Void)?, shouldDismiss: Bool)

UIKit+SkeletonLayout

Public

UIView+AlertPlugin

UIView+EmptyPlugin

UIViewController+ImagePickerPlugin

  • 自定义图片选取插件,未设置时自动从插件池加载

    Declaration

    Swift

    public var fw_imagePickerPlugin: ImagePickerPlugin! { get set }
  • 从Camera选取单张图片(简单版)

    Declaration

    Swift

    public func fw_showImageCamera(allowsEditing: Bool, completion: @escaping (UIImage?, Bool) -> Void)

    Parameters

    allowsEditing

    是否允许编辑

    completion

    完成回调,主线程。参数1为图片,2为是否取消

  • 从Camera选取单张图片(详细版)

    Declaration

    Swift

    public func fw_showImageCamera(filterType: ImagePickerFilterType, allowsEditing: Bool, customBlock: ((Any) -> Void)? = nil, completion: @escaping (Any?, Any?, Bool) -> Void)

    Parameters

    filterType

    过滤类型,默认0同系统

    allowsEditing

    是否允许编辑

    customBlock

    自定义配置句柄,默认nil

    completion

    完成回调,主线程。参数1为对象(UIImage|PHLivePhoto|NSURL),2为结果信息,3为是否取消

  • 从图片库选取单张图片(简单版)

    Declaration

    Swift

    public func fw_showImagePicker(allowsEditing: Bool, completion: @escaping (UIImage?, Bool) -> Void)

    Parameters

    allowsEditing

    是否允许编辑

    completion

    完成回调,主线程。参数1为图片,2为是否取消

  • 从图片库选取多张图片(简单版)

    Declaration

    Swift

    public func fw_showImagePicker(selectionLimit: Int, allowsEditing: Bool, completion: @escaping ([UIImage], [Any], Bool) -> Void)

    Parameters

    selectionLimit

    最大选择数量

    allowsEditing

    是否允许编辑

    completion

    完成回调,主线程。参数1为图片数组,2为结果数组,3为是否取消

  • 从图片库选取多张图片(详细版)

    Declaration

    Swift

    public func fw_showImagePicker(filterType: ImagePickerFilterType, selectionLimit: Int, allowsEditing: Bool, customBlock: ((Any) -> Void)? = nil, completion: @escaping ([Any], [Any], Bool) -> Void)

    Parameters

    filterType

    过滤类型,默认0同系统

    selectionLimit

    最大选择数量

    allowsEditing

    是否允许编辑

    customBlock

    自定义配置句柄,默认nil

    completion

    完成回调,主线程。参数1为对象数组(UIImage|PHLivePhoto|NSURL),2位结果数组,3为是否取消

UIViewController+ImagePreviewPlugin

  • 自定义图片预览插件,未设置时自动从插件池加载

    Declaration

    Swift

    public var fw_imagePreviewPlugin: ImagePreviewPlugin! { get set }
  • 显示图片预览(简单版)

    Declaration

    Swift

    public func fw_showImagePreview(imageURLs: [Any], imageInfos: [Any]? = nil, currentIndex: Int = 0, sourceView: ((Int) -> Any?)? = nil)

    Parameters

    imageURLs

    预览图片列表,支持NSString|UIImage|PHLivePhoto|AVPlayerItem类型

    imageInfos

    自定义图片信息数组

    currentIndex

    当前索引,默认0

    sourceView

    来源视图,可选,支持UIView|NSValue.CGRect,默认nil

  • 显示图片预览(详细版)

    Declaration

    Swift

    public func fw_showImagePreview(imageURLs: [Any], imageInfos: [Any]?, currentIndex: Int, sourceView: ((Int) -> Any?)?, placeholderImage: ((Int) -> UIImage?)?, renderBlock: ((UIView, Int) -> Void)? = nil, customBlock: ((Any) -> Void)? = nil)

    Parameters

    imageURLs

    预览图片列表,支持NSString|UIImage|PHLivePhoto|AVPlayerItem类型

    imageInfos

    自定义图片信息数组

    currentIndex

    当前索引,默认0

    sourceView

    来源视图句柄,支持UIView|NSValue.CGRect,默认nil

    placeholderImage

    占位图或缩略图句柄,默认nil

    renderBlock

    自定义渲染句柄,默认nil

    customBlock

    自定义句柄,默认nil

UIViewController+ToastPlugin

  • 设置吐司是否显示在window上,默认NO,显示到view上

    Declaration

    Swift

    public var fw_toastInWindow: Bool { get set }
  • 设置吐司是否显示在祖先视图上,默认NO,显示到view上

    Declaration

    Swift

    public var fw_toastInAncestor: Bool { get set }
  • 自定义吐司插件,未设置时自动从插件池加载

    Declaration

    Swift

    public var fw_toastPlugin: ToastPlugin! { get set }
  • 设置吐司外间距,默认zero

    Declaration

    Swift

    public var fw_toastInsets: UIEdgeInsets { get set }
  • 获取或设置吐司容器视图,默认view

    Declaration

    Swift

    public var fw_toastContainer: UIView! { get set }
  • 显示加载吐司,默认需手工隐藏,指定cancelBlock时点击会自动隐藏并调用之,支持String和AttributedString

    Declaration

    Swift

    public func fw_showLoading(text: AttributedStringParameter? = nil, cancelBlock: (() -> Void)? = nil, customBlock: ((Any) -> Void)? = nil)
  • 隐藏加载吐司,可指定延迟隐藏从而实现连续的加载效果

    Declaration

    Swift

    public func fw_hideLoading(delayed: Bool = false)
  • 获取正在显示的加载吐司视图

    Declaration

    Swift

    public var fw_showingLoadingView: UIView? { get }
  • 是否正在显示加载吐司

    Declaration

    Swift

    public var fw_isShowingLoading: Bool { get }
  • 显示进度条吐司,默认需手工隐藏,指定cancelBlock时点击会自动隐藏并调用之,支持String和AttributedString

    Declaration

    Swift

    public func fw_showProgress(_ progress: CGFloat, text: AttributedStringParameter? = nil, cancelBlock: (() -> Void)? = nil, customBlock: ((Any) -> Void)? = nil)
  • 隐藏进度条吐司

    Declaration

    Swift

    public func fw_hideProgress()
  • 获取正在显示的进度条吐司视图

    Declaration

    Swift

    public var fw_showingProgressView: UIView? { get }
  • 是否正在显示进度条吐司

    Declaration

    Swift

    public var fw_isShowingProgress: Bool { get }
  • 显示错误消息吐司,自动隐藏,自动隐藏完成后回调

    Declaration

    Swift

    public func fw_showMessage(error: Error?, completion: (() -> Void)? = nil)
  • 显示指定样式消息吐司,自动隐藏,自动隐藏完成后回调,支持String和AttributedString

    Declaration

    Swift

    public func fw_showMessage(text: AttributedStringParameter?, style: ToastStyle = .default, completion: (() -> Void)? = nil)
  • 显示指定样式消息吐司,可设置自动隐藏和允许交互,自动隐藏完成后回调,支持String和AttributedString

    Declaration

    Swift

    public func fw_showMessage(text: AttributedStringParameter?, style: ToastStyle, autoHide: Bool, interactive: Bool, completion: (() -> Void)? = nil, customBlock: ((Any) -> Void)? = nil)
  • 隐藏消息吐司

    Declaration

    Swift

    public func fw_hideMessage()
  • 获取正在显示的消息吐司视图

    Declaration

    Swift

    public var fw_showingMessageView: UIView? { get }
  • 是否正在显示消息吐司

    Declaration

    Swift

    public var fw_isShowingMessage: Bool { get }

UIViewController+Adaptive

  • 当前状态栏布局高度,导航栏隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_statusBarHeight: CGFloat { get }
  • 当前导航栏布局高度,隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_navigationBarHeight: CGFloat { get }
  • 当前顶部栏布局高度,导航栏隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_topBarHeight: CGFloat { get }
  • 当前标签栏布局高度,隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_tabBarHeight: CGFloat { get }
  • 当前工具栏布局高度,隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_toolBarHeight: CGFloat { get }
  • 当前底部栏布局高度,包含标签栏和工具栏,隐藏时为0,推荐使用

    Declaration

    Swift

    public var fw_bottomBarHeight: CGFloat { get }

UIViewController+Block

  • 快捷设置导航栏标题文字

    Declaration

    Swift

    public var fw_title: String? { get set }
  • 设置导航栏返回按钮,支持UIBarButtonItem|NSString|UIImage等,nil时显示系统箭头

    Declaration

    Swift

    public var fw_backBarItem: Any? { get set }
  • 设置导航栏左侧按钮,支持UIBarButtonItem|UIImage等,默认事件为关闭当前页面

    Declaration

    Swift

    public var fw_leftBarItem: Any? { get set }
  • 设置导航栏右侧按钮,支持UIBarButtonItem|UIImage等,默认事件为关闭当前页面

    Declaration

    Swift

    public var fw_rightBarItem: Any? { get set }
  • 快捷设置导航栏左侧按钮。注意自定义left按钮之后,系统返回手势失效

    Declaration

    Swift

    public func fw_setLeftBarItem(_ object: Any?, target: Any, action: Selector)
  • 快捷设置导航栏左侧按钮,block事件。注意自定义left按钮之后,系统返回手势失效

    Declaration

    Swift

    public func fw_setLeftBarItem(_ object: Any?, block: @escaping (UIBarButtonItem) -> Void)
  • 快捷设置导航栏右侧按钮

    Declaration

    Swift

    public func fw_setRightBarItem(_ object: Any?, target: Any, action: Selector)
  • 快捷设置导航栏右侧按钮,block事件

    Declaration

    Swift

    public func fw_setRightBarItem(_ object: Any?, block: @escaping (UIBarButtonItem) -> Void)
  • 快捷添加导航栏左侧按钮。注意自定义left按钮之后,系统返回手势失效

    Declaration

    Swift

    public func fw_addLeftBarItem(_ object: Any?, target: Any, action: Selector)
  • 快捷添加导航栏左侧按钮,block事件。注意自定义left按钮之后,系统返回手势失效

    Declaration

    Swift

    public func fw_addLeftBarItem(_ object: Any?, block: @escaping (UIBarButtonItem) -> Void)
  • 快捷添加导航栏右侧按钮

    Declaration

    Swift

    public func fw_addRightBarItem(_ object: Any?, target: Any, action: Selector)
  • 快捷添加导航栏右侧按钮,block事件

    Declaration

    Swift

    public func fw_addRightBarItem(_ object: Any?, block: @escaping (UIBarButtonItem) -> Void)

UIViewController+Toolkit

  • 当前生命周期状态,需实现ViewControllerLifecycleObservable或手动添加监听后才有值,默认nil

    Declaration

    Swift

    public internal(set) var fw_lifecycleState: ViewControllerLifecycleState? { get set }
  • 添加生命周期变化监听句柄,可携带自定义参数(注意deinit不能访问runtime关联属性),返回监听者observer

    Declaration

    Swift

    @discardableResult
    public func fw_observeLifecycleState(object: Any? = nil, block: @escaping (UIViewController, ViewControllerLifecycleState, Any?) -> Void) -> NSObjectProtocol
  • 移除生命周期监听者,传nil时移除所有

    Declaration

    Swift

    @discardableResult
    public func fw_unobserveLifecycleState(observer: Any? = nil) -> Bool
  • 自定义完成结果对象,默认nil

    Declaration

    Swift

    public var fw_completionResult: Any? { get set }
  • 自定义完成句柄,默认nil,dealloc时自动调用,参数为completionResult。支持提前调用,调用后需置为nil

    Declaration

    Swift

    public var fw_completionHandler: ((Any?) -> Void)? { get set }
  • 自定义侧滑返回手势VC开关句柄,enablePopProxy启用后生效,仅处理边缘返回手势,优先级低,默认nil

    Declaration

    Swift

    public var fw_allowsPopGesture: (() -> Bool)? { get set }
  • 自定义控制器返回VC开关句柄,enablePopProxy启用后生效,统一处理返回按钮点击和边缘返回手势,优先级高,默认nil

    Declaration

    Swift

    public var fw_shouldPopController: (() -> Bool)? { get set }
  • 自定义侧滑返回手势VC开关,enablePopProxy启用后生效,仅处理边缘返回手势,优先级低,自动调用fw.allowsPopGesture,默认true

    Declaration

    Swift

    open var allowsPopGesture: Bool { get }
  • 自定义控制器返回VC开关,enablePopProxy启用后生效,统一处理返回按钮点击和边缘返回手势,优先级高,自动调用fw.shouldPopController,默认true

    Declaration

    Swift

    open var shouldPopController: Bool { get }

UIViewController+UIKit

  • 判断当前控制器是否是头部控制器。如果是导航栏的第一个控制器或者不含有导航栏,则返回YES

    Declaration

    Swift

    public var fw_isHead: Bool { get }
  • 判断当前控制器是否是尾部控制器。如果是导航栏的最后一个控制器或者不含有导航栏,则返回YES

    Declaration

    Swift

    public var fw_isTail: Bool { get }
  • 判断当前控制器是否是子控制器。如果父控制器存在,且不是导航栏或标签栏控制器,则返回YES

    Declaration

    Swift

    public var fw_isChild: Bool { get }
  • 判断当前控制器是否是present弹出。如果是导航栏的第一个控制器且导航栏是present弹出,也返回YES

    Declaration

    Swift

    public var fw_isPresented: Bool { get }
  • 判断当前控制器是否是iOS13+默认pageSheet弹出样式。该样式下导航栏高度等与默认样式不同

    Declaration

    Swift

    public var fw_isPageSheet: Bool { get }
  • 视图是否可见,viewWillAppear后为YES,viewDidDisappear后为NO

    Declaration

    Swift

    public var fw_isViewVisible: Bool { get }
  • 控制器是否可见,视图可见、尾部控制器、且不含presented控制器时为YES

    Declaration

    Swift

    public var fw_isVisible: Bool { get }
  • 获取祖先视图,标签栏存在时为标签栏根视图,导航栏存在时为导航栏根视图,否则为控制器根视图

    Declaration

    Swift

    public var fw_ancestorView: UIView { get }
  • 是否已经加载完数据,默认NO,加载数据完成后可标记为YES,可用于第一次加载时显示loading等判断

    Declaration

    Swift

    public var fw_isDataLoaded: Bool { get set }
  • 移除子控制器,解决不能触发viewWillAppear等的bug

    Declaration

    Swift

    public func fw_removeChild(_ viewController: UIViewController)
  • 添加子控制器到当前视图,解决不能触发viewWillAppear等的bug

    Declaration

    Swift

    public func fw_addChild(_ viewController: UIViewController, layout: ((UIView) -> Void)? = nil)
  • 添加子控制器到指定视图,解决不能触发viewWillAppear等的bug

    Declaration

    Swift

    public func fw_addChild(_ viewController: UIViewController, in view: UIView?, layout: ((UIView) -> Void)? = nil)
  • 弹出popover控制器

    Declaration

    Swift

    public func fw_presentPopover(
        _ popover: UIViewController,
        sourcePoint: CGPoint,
        size: CGSize? = nil,
        delegate: (any UIPopoverPresentationControllerDelegate)? = nil,
        animated: Bool = true,
        completion: (() -> Void)? = nil
    )