ScrollingFollowView 1.1.1

ScrollingFollowView 1.1.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2017年2月
SPM支持 SPM

ktanaka117 维护。



ScrollingFollowView

ScrollingFollowView 是一个简单的视图,它跟随 UIScrollView 的滚动。

ScrollingFollowView 样图

  • SearchBarSample : SearchBar 区域
  • ProfileViewSample : 喜欢的个人资料视图区域
  • BottomButtonSample : SearchBar 和底部按钮区域

如何使用

使用 Interface Builder 进行布局

ScrollingFollowView 仅支持使用 AutoLayout。 (我不会强制库用户使用此功能。我将修改此功能。请查看未来改进。)您必须像示例图像中那样使用 InterfaceBuilder 创建布局。

代码

@IBOutlet weak var scrollingFollowView: ScrollingFollowView!

// NSLayoutConstraint of moving edge.
@IBOutlet weak var constraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    let scrollingFollowViewHeight = scrollingFollowView.frame.size.height
    let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height

    // First setup
    // In default use, maxFollowPoint should be maxPoint of following to scroll DOWN.
    // In default use, minFollowPoint should be maxPoint of following to scroll UP.
    scrollingFollowView.setup(constraint: constraint, maxFollowPoint: scrollingFollowViewHeight + statusBarHeight, minFollowPoint: 0)
}
func scrollViewDidScroll(scrollView: UIScrollView) {
    // scrollingFollowView follows UIScrollView scrolling.
    scrollingFollowView.didScroll(scrollView)
}

高级使用

使用 show(animated:) 和 hide(animated:]

您可以对 ScrollingFollowView 对象使用 show(animated:)hide(animated:) 方法,如下所示:

// show
@IBAction func showButton() {
    scrollingFollowView.show(true)
    scrollingFollowView.resetPreviousPoint(scrollView)
}
// hide
@IBAction func hideButton() {
    scrollingFollowView.hide(false)
    scrollingFollowView.resetPreviousPoint(scrollView)
}

resetPreviousPoint(scrollView:) 必须在 show(animated:)hide:animated) 之后调用,previousPoint 是 ScrollingFollowView 的私有属性,用于更改约束 constant 值。

并且显示和隐藏方法声明如下:

func show(animated: Bool, duration: Double = 0.2, completionHandler: (()->())? = nil)
func hide(animated: Bool, duration: Double = 0.2, completionHandler: (()->())? = nil)

因此,您可以为动画设置 动画持续时长完成后处理

// show
@IBAction func showButton() {
    scrollingFollowView.show(true, duration: 0.6) { print("showed") }
    scrollingFollowView.resetPreviousPoint(scrollView)
}
// hide
@IBAction func hideButton() {
    scrollingFollowView.hide(true, duration: 0.5) { print("hid") }
    scrollingFollowView.resetPreviousPoint(scrollView)
}

使用延迟点

您可以使用隐藏和显示延迟点,如下面的 gif 所示:

添加 setupDelayPoints(pointOfStartingHiding:pointOfStartingShowing:)。例如,在 viewDidLoad() 中写入:

override func viewDidLoad() {
    super.viewDidLoad()

    let scrollingFollowViewHeight = scrollingFollowView.frame.size.height
    let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height

    scrollingFollowView.setup(constraint: constraint, maxFollowPoint: scrollingFollowViewHeight + statusBarHeight, minFollowPoint: 0)

    scrollingFollowView.setupDelayPoints(pointOfStartingHiding: 100, pointOfStartingShowing: 50)
}

使用控制半显示状态

你可以像下面 gif 显示的那样控制半显示状态:

allowHalfDisplay

disallowHalfDisplay(自动动画)

您必须将参数 allowHalfDisplay 添加到 setup(constraint:maxFollowPoint:minFollowPoint:allowHalfDesplay:) 函数中。

override func viewDidLoad() {
    super.viewDidLoad()

    let scrollingFollowViewHeight = scrollingFollowView.frame.size.height
    let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height

    // allowHalfDisplay: Default is false.
    // When allowHalfDisplay is true, ScrollingFollowView can display following scrolling state.
    // When allowHalfDisplay is false, ScrollingFollowView can't display following scrolling state. (If ScrollingFollowView is half-display state, it automatically animates.)
    scrollingFollowView.setup(constraint: constraint, maxFollowPoint: scrollingFollowViewHeight + statusBarHeight, minFollowPoint: 0, allowHalfDisplay: true)
}

并且您还必须在 scrollViewDidEndDecelerating(_ scrollView:)scrollViewDidEndDragging(_ scrollView:willDecelerate:) 中调用 didEndScrolling()didEndScrolling(_ decelerate:)

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        navBarScrollingFollowView.didEndScrolling()
    }

    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        navBarScrollingFollowView.didEndScrolling(decelerate)
    }
}

运行要求

  • iOS 8.0 或更高版本
  • Swift 3.0 或更高版本
  • Xcode 8.0 或更高版本

未来改进

  • 重构。💪
  • 启用像 UITabBarController 一样的使用。
  • 仅使用代码即可实现。
  • 启用通过帧布局移动 ScrollingFollowView。
  • 启用水平移动 ScrollingFollowView。
  • 启用无需传递约束参数便管理约束。 (我想我们只想选择一个跟随滚动的边。例如 .Top, .Bottom, .Left, .Right。)

联系方式

如果您对这个库有任何意见或想法,请通过 Twitter 给我回复。🍣 @ktanaka117

许可证

ScrollingFollowView 在 MIT 许可下发布。请阅读 LICENSE 文件以获取更多信息。