测试已测试 | ✗ |
语言语言 | 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 文件。