BRDropDownView 0.1.1

BRDropDownView 0.1.1

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2017年10月
SwiftSwift版本echo "4.0" > .swift-version`
SPM支持SPM

BRCountDownView 维护。






BRDropDownView : "观察目标视图的Y偏移,然后下拉和上滑自定义UI视图,支持多种样式。"



BRDropDownView 是一个 无聊 的下拉和上滑动画 UIView 组件,根据您要观察的视图的 Y 偏移进行动画,支持各种子视图类型的样式。

示例

要运行示例项目,请克隆该仓库,然后首先从示例目录中运行 pod install

要求

iOS 9.0 +

Swift 3.0 +

安装

BRDropDownView 通过 CocoaPods 提供。要安装
它,只需将以下行添加到您的 Podfile 中

pod 'BRDropDownView'

如何使用

强烈建议使用程序方式使用 BRDropDownView

请参阅以下代码,参看包含的示例项目。

使用非常直接。

import UIKit
import BRDropDownView

class ViewController: UIViewController {
  @IBOutlet var tableView: UITableView!
  var dropdownViewstyle: DropDownViewStyle = .typeA

  let firstOffSet: CGFloat = 0
  let secondOffSet: CGFloat = 1000.0
  let thirdOffSet: CGFloat = 2000.0
  let fourthOffSet: CGFloat = 3000.0

  let cellReusableIdentifier = "cellID"
  let sampleIdentifier0 = "Sample0"
  let sampleIdentifier1 = "Sample1"

  let heightOfDropDownView: CGFloat = 100.0

  lazy var dropdownView: BRDropDownView = {
  let dropdownView = BRDropDownView(height: heightOfDropDownView,
  dropdownViewStyle: dropdownViewstyle)
  dropdownView.delegate = self
  dropdownView.triggerOffsetY = 20.0

  // Top Main 4 Properties
  // dropdownView.backButton
  // dropdownView.searchButton
  // dropdownView.shoppingCartButton
  // dropdownView.centerTopNoticeLabel.text = "Custom!"
  // dropdownView.centerTopNoticeLabel.textAlignment = .center

  // Bottom SubView Properties depending on given 3 style.
  switch dropdownViewstyle {
  case .typeA:
    dropdownView.countdownView.set(seconds:30)

    dropdownView.countdownView.didFinish = {
      [unowned self] sender in
      print("countdown finished!")
    }

    dropdownView.countdownView.didRepeat = {
      [unowned self] sender in
      print("countdown repeated!")
    }

  case .typeB:
    dropdownView.leftSubLabel.text = "left"
    dropdownView.leftSubLabel.font.withSize(10)
    dropdownView.leftSubLabel.textAlignment = .center
    dropdownView.leftSubLabel.sizeToFit()

    dropdownView.rightSubLabel.text = "right"
    dropdownView.rightSubLabel.font.withSize(10)
    dropdownView.rightSubLabel.textAlignment = .center
    dropdownView.rightSubLabel.sizeToFit()

    dropdownView.mainSubLabel.text = "main"
    dropdownView.mainSubLabel.font.withSize(14)
    dropdownView.mainSubLabel.textAlignment = .center
    dropdownView.mainSubLabel.sizeToFit()
  case .typeC:
    dropdownView.firstSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.firstOffSet)
    }

    dropdownView.secondSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.secondOffSet)
    }

    dropdownView.thirdSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.thirdOffSet)
    }

    dropdownView.fourthSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.fourthOffSet)
    }
  }

  return dropdownView
  }()

  private var isStatusBarHidden = true {
    didSet {
      setNeedsStatusBarAppearanceUpdate()
    }
  }

  override var prefersStatusBarHidden: Bool {
    return isStatusBarHidden
  }

  override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.setNavigationBarHidden(true, animated: false)
  }

  override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationController?.setNavigationBarHidden(false, animated: false)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    tableView.delegate = self
    tableView.dataSource = self
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellReusableIdentifier)

    self.view.addSubview(self.dropdownView)
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
}

// MARK: - BRDropDownViewDelegate Methods.
extension ViewController: BRDropDownViewDelegate {
  func didDropUpCompleted(sender: BRDropDownView) {
    print("didDropUpCompleted!")
  }

  func didDropDownCompleted(sender: BRDropDownView) {
    print("didDropDownCompleted!")
  }

  func backButtonDidTouch(sender: BRDropDownView) -> Void {
    print("backButtonDidTouch in delegate!")
    self.navigationController?.popViewController(animated: true)
  }

  func searchButtonDidTouch(sender: BRDropDownView) -> Void {
    print("searchButtonDidTouch in delegate!")
    self.performSegue(withIdentifier: sampleIdentifier0, sender: nil)
  }

  func shoppingCartButtonDidTouch(sender: BRDropDownView) -> Void {
    print("shoppingCartButtonDidTouch in delegate!")
    self.performSegue(withIdentifier: sampleIdentifier1, sender: nil)
  }
}

// MARK: - Own methods.
extension UITableView {
  func moveTo(offSet: CGFloat) -> Void {
    let point = CGPoint(x:0, y:offSet)
    self.setContentOffset(point, animated: true)
  }
}

// MARK: - UITableViewDelegate, UITableViewDataSource Methods.
extension ViewController: UITableViewDelegate, UITableViewDataSource {
  func numberOfSections(in tableView: UITableView) -> Int {
    return 1
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 100
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: cellReusableIdentifier, for: indexPath)

    cell.textLabel?.text = "\(indexPath.row)"
    cell.imageView?.image = #imageLiteral(resourceName: "image00")

    return cell
  }

  func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
  }

  func scrollViewDidScroll(_ scrollView: UIScrollView) {
    dropdownView.observe(scrollView,
                         firstSectionOffSet: firstOffSet,
                         secondSectionOffSet: secondOffSet,
                         thirdSectionOffSet: thirdOffSet,
                         fourthSectionOffSet: fourthOffSet)
  }
}

触发偏移量 Y 使得 BRDropDownView 下拉和上滑
BRDropDownView 根据 triggerOffsetY 属性进行动画,实现下拉和上滑。

您可以设置如下偏移量。

dropdownView.triggerOffsetY = 20.0

样式 C:移动到偏移量
通过触摸 BRDropDown 样式 C 上的 4 个标签部分,您可以使得UITableView移动到您想要的偏移量。

dropdownView.firstSectionLabelTapped = {
  [unowned self] in
  self.tableView.moveTo(offSet: self.firstOffSet)
}

dropdownView.secondSectionLabelTapped = {
  [unowned self] in
  self.tableView.moveTo(offSet: self.secondOffSet)
}

dropdownView.thirdSectionLabelTapped = {
  [unowned self] in
  self.tableView.moveTo(offSet: self.thirdOffSet)
}

dropdownView.fourthSectionLabelTapped = {
  [unowned self] in
  self.tableView.moveTo(offSet: self.fourthOffSet)
}

BRDropDownView 可以观察滚动偏移量 Y。

根据偏移量 Y,显示适当的区域以通知用户在滚动表格视图时偏移量 Y 的位置。

func scrollViewDidScroll(_ scrollView: UIScrollView) {
  dropdownView.observe(scrollView,
                       firstSectionOffSet: firstOffSet,
                       secondSectionOffSet: secondOffSet,
                       thirdSectionOffSet: thirdOffSet,
                       fourthSectionOffSet: fourthOffSet)
}

BRDropDownView 样式
您可以使用三种内置 BRDropDownView 样式之一。

public enum DropDownViewStyle: Int {
  case typeA
  case typeB
  case typeC
}

let dropdownViewstyle: DropDownViewStyle = .typeC
let dropdownView = BRDropDownView(height: 100.0, dropdownViewStyle: dropdownViewstyle)

自定义
您可以通过使用公开的 API 来自定义 BRDropDownView。

以下是一个示例代码。

// Bottom SubView Properties depending on given 3 style.
switch dropdownViewstyle {
  case .typeA:
    dropdownView.countdownView.set(seconds:30)

    dropdownView.countdownView.didFinish = {
      [unowned self] sender in
      print("countdown finished!")
    }

    dropdownView.countdownView.didRepeat = {
      [unowned self] sender in
      print("countdown repeated!")
    }

  case .typeB:
    dropdownView.leftSubLabel.text = "left"
    dropdownView.leftSubLabel.font.withSize(10)
    dropdownView.leftSubLabel.textAlignment = .center
    dropdownView.leftSubLabel.sizeToFit()

    dropdownView.rightSubLabel.text = "right"
    dropdownView.rightSubLabel.font.withSize(10)
    dropdownView.rightSubLabel.textAlignment = .center
    dropdownView.rightSubLabel.sizeToFit()

    dropdownView.mainSubLabel.text = "main"
    dropdownView.mainSubLabel.font.withSize(14)
    dropdownView.mainSubLabel.textAlignment = .center
    dropdownView.mainSubLabel.sizeToFit()
  case .typeC:
    dropdownView.firstSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.firstOffSet)
    }

    dropdownView.secondSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.secondOffSet)
    }

    dropdownView.thirdSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.thirdOffSet)
    }

    dropdownView.fourthSectionLabelTapped = {
      [unowned self] in
      self.tableView.moveTo(offSet: self.fourthOffSet)
    }
}

BRDropDownView 代理方法
事件可以通过代理传统地通知。

// MARK: - BRDropDownViewDelegate protocols.
public protocol BRDropDownViewDelegate: NSObjectProtocol {
  func didDropDownCompleted(sender: BRDropDownView) -> Void
  func didDropUpCompleted(sender: BRDropDownView) -> Void
  func backButtonDidTouch(sender: BRDropDownView) -> Void
  func searchButtonDidTouch(sender: BRDropDownView) -> Void
  func shoppingCartButtonDidTouch(sender: BRDropDownView) -> Void
}

....
...
..
.

dropdownView.delegate = self

extension ViewController: BRDropDownViewDelegate {
  func didDropUpCompleted(sender: BRDropDownView) {
    print("didDropUpCompleted!")
  }

  func didDropDownCompleted(sender: BRDropDownView) {
    print("didDropDownCompleted!")
  }

  func backButtonDidTouch(sender: BRDropDownView) -> Void {
    print("backButtonDidTouch in delegate!")
    self.navigationController?.popViewController(animated: true)
  }

  func searchButtonDidTouch(sender: BRDropDownView) -> Void {
    print("searchButtonDidTouch in delegate!")
    self.performSegue(withIdentifier: sampleIdentifier0, sender: nil)
  }

  func shoppingCartButtonDidTouch(sender: BRDropDownView) -> Void {
    print("shoppingCartButtonDidTouch in delegate!")
    self.performSegue(withIdentifier: sampleIdentifier1, sender: nil)
  }
}

作者

Jang seoksoon, [email protected]

许可

BRDropDownView 在 MIT 许可下提供。有关更多相关信息,请参阅 LICENSE 文件。