From 275af731a41e0cc306ee91af044cf36c405350c4 Mon Sep 17 00:00:00 2001 From: wangshuai Date: Sat, 18 Dec 2021 00:26:28 +0800 Subject: [PATCH] Initial commit --- Pictures/SGPagingView.png | Bin 47116 -> 39627 bytes README.md | 13 +- READMEOBJC.md | 29 +--- SGPagingView.podspec | 2 +- SGPagingView.xcodeproj/project.pbxproj | 6 +- SGPagingView/Example/AttributedVC.swift | 76 ++++++++- SGPagingView/Example/FixedOneVC.swift | 2 +- SGPagingView/Example/FixedTwoVC.swift | 2 +- SGPagingView/ViewController.swift | 62 +++---- .../Extensions/UIButton+SGPagingView.swift | 6 +- .../Extensions/UIScreen+SGPagingView.swift | 14 +- .../SGPagingContentCollectionView.swift | 14 +- .../SGPagingContentScrollView.swift | 9 +- .../PagingContent/SGPagingContentView.swift | 16 +- Sources/PagingTitle/SGPagingTitleView.swift | 161 +++++++++++------- .../SGPagingTitleViewConfigure.swift | 89 +++++----- 16 files changed, 297 insertions(+), 204 deletions(-) diff --git a/Pictures/SGPagingView.png b/Pictures/SGPagingView.png index d5b627dd9eb5b8f76304ce1ab8e682ef27797274..f2d1f21511c1f32f822bccf7fa32a941ef55c008 100644 GIT binary patch literal 39627 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 F_n)_Ei&6jp literal 47116 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 2.0.0' +## Installation +* CocoaPods 导入 pod 'SGPagingView', '~> 2.1.0' ## 代码介绍 * 初始化方法 ``` +// 配置类 let configure = SGPagingTitleViewConfigure() -// PagingTitle + +// 标题视图 let pagingTitleView = SGPagingTitleView(frame: frame, titles: titles, configure: configure) pagingTitleView.delegate = self view.addSubview(pagingTitleView) -// PagingContent +// 内容视图 let pagingContentView = SGPagingContentScrollView(frame: frame, parentVC: self, childVCs: childVCs) pagingContentView.delegate = self view.addSubview(pagingContentView) @@ -54,5 +57,5 @@ func pagingContentView(contentView: SGPagingContentView, progress: CGFloat, curr ## Concluding remarks -* 如有问题 [issues](https://github.com/kingsic/SGPagingView/issues) 或加QQ群:825339547 +* 如有问题 [issues](https://github.com/kingsic/SGPagingView/issues) diff --git a/READMEOBJC.md b/READMEOBJC.md index b5275d2..559b45b 100644 --- a/READMEOBJC.md +++ b/READMEOBJC.md @@ -1,7 +1,9 @@ ## 前言 -* 从2.0.0版本起,Swift 语言将代替之前的 Objective-C 语言 -* Objective-C 语言最后的版本号是:[1.7.2](https://github.com/kingsic/SGPagingView/releases/tag/1.7.2),且不在给予维护 +* 从 2.0.0 版本起,升级为 Swift 编程语言 +* 从 2.1.0 版本起,已兼容 Objective-C 语义 +* Objective-C 编程语言最后的版本是 [1.7.2](https://github.com/kingsic/SGPagingView/releases/tag/1.7.2),且不在给予维护 + ## 结构图 ``` @@ -23,13 +25,14 @@ SGPageContentCollectionView(内部由 UICollectionView 实现) ## 代码介绍 * 初始化方法 ``` -/// pageTitleViewConfigure +// 配置类 SGPageTitleViewConfigure *configure = [SGPageTitleViewConfigure pageTitleViewConfigure]; -/// pageTitleView + +// 标题视图 SGPageTitleView *pageTitleView = [SGPageTitleView pageTitleViewWithFrame:frame delegate:self titleNames:titleNames configure:configure]; [self.view addSubview:pageTitleView]; -/// pageContent +// 内容视图 SGPageContentScrollView *pageContentScrollView = [[SGPageContentScrollView alloc] initWithFrame:frame parentVC:self childVCs:childVCs]; pageContentScrollView.delegatePageContentScrollView = self; [self.view addSubview:pageContentScrollView]; @@ -121,26 +124,10 @@ b. 实现 SGPageContentScrollView 的 pageContentScrollView:index:代理方法 * 2017-10-17 :v1.3.0 版本升级:新增 SGPageTitleViewConfigure 类及支持指示器遮盖样式 -* 2018-05-08 :v1.3.7 修复 1.3.6 版本选中标题重复点击恢复默认状态及新增相关配置属性 - * 2018-07-09 :v1.5.0 版本升级:具体相关信息请查看 [releases](https://github.com/kingsic/SGPagingView/releases) 中版本介绍 -* 2018-08-28 :v1.5.2 SGPageContentScrollView 内部代码优化处理(感谢 [petyou](https://github.com/petyou) 提供的优化方案) - -* 2018-09-01 :v1.5.3 新增 SGPagingViewPopGestureVC 用于解决侧滑返回手势 - -* 2018-09-26 :v1.5.5 标题文字缩放效果由文字缩放调整为控件缩放 - -* 2018-12-01 :v1.5.6 SGPageTitleView 新增重置标题、指示器颜色方法 - * 2019-01-09 :v1.6.0 版本升级:支持 autolayout 布局 -* 2019-03-27 :v1.6.1 修复 addBadgeForIndex 方法内 badge 布局问题 - -* 2019-07-17 :v1.6.3 修复设置图片样式下图片布局问题及内部代码优化处理 - -* 2019-07-20 :v1.6.5 滚动样式下 titleTextZoom 属性支持指示器下划线及遮盖样式的滚动 - * 2019-07-22 :v1.6.6 SGPageTitleViewConfigure 新增 equivalence 属性支持静止样式下标题从左到右自动布局 * 2019-07-27 :v1.6.7 标题支持上下行及 titleGradientEffect 属性与 resetTitleColor:titleSelectedColor: 方法兼容 diff --git a/SGPagingView.podspec b/SGPagingView.podspec index 0699555..ce62198 100644 --- a/SGPagingView.podspec +++ b/SGPagingView.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |spec| spec.name = "SGPagingView" - spec.version = "2.0.0" + spec.version = "2.1.0" spec.summary = "A powerful and easy to use segment view" spec.homepage = "https://github.com/kingsic/SGPagingView" spec.license = "MIT" diff --git a/SGPagingView.xcodeproj/project.pbxproj b/SGPagingView.xcodeproj/project.pbxproj index 421d9bf..a0fe4b5 100644 --- a/SGPagingView.xcodeproj/project.pbxproj +++ b/SGPagingView.xcodeproj/project.pbxproj @@ -207,10 +207,10 @@ 8D173CFE2763A90B00B59F4D /* PagingContent */ = { isa = PBXGroup; children = ( - 8D173CFF2763A90B00B59F4D /* SGPagingContentView.swift */, - 8D173D012763A90B00B59F4D /* SGPagingContentViewDelegate.swift */, 8D173D022763A90B00B59F4D /* SGPagingContentCollectionView.swift */, 8D173D002763A90B00B59F4D /* SGPagingContentScrollView.swift */, + 8D173CFF2763A90B00B59F4D /* SGPagingContentView.swift */, + 8D173D012763A90B00B59F4D /* SGPagingContentViewDelegate.swift */, ); path = PagingContent; sourceTree = ""; @@ -231,9 +231,9 @@ 8D173D192763A92600B59F4D /* FixedTwoVC.swift */, 8D173D102763A92600B59F4D /* ScrollVC.swift */, 8D173D232763A92600B59F4D /* AttributedVC.swift */, - 8D173D172763A92600B59F4D /* BadgeVC.swift */, 8D173D242763A92600B59F4D /* GradientEffectVC.swift */, 8D173D182763A92600B59F4D /* ZoomVC.swift */, + 8D173D172763A92600B59F4D /* BadgeVC.swift */, 8D173D1B2763A92600B59F4D /* IFixedVC.swift */, 8D173D1A2763A92600B59F4D /* IDynamicVC.swift */, 8D173D162763A92600B59F4D /* CoverOneVC.swift */, diff --git a/SGPagingView/Example/AttributedVC.swift b/SGPagingView/Example/AttributedVC.swift index 74c9a0c..045625c 100644 --- a/SGPagingView/Example/AttributedVC.swift +++ b/SGPagingView/Example/AttributedVC.swift @@ -8,7 +8,7 @@ import UIKit -class AttributedVC: UIViewController, SGPagingTitleViewDelegate { +class AttributedVC: UIViewController { deinit { print("AttributedVC - deinit") @@ -21,6 +21,8 @@ class AttributedVC: UIViewController, SGPagingTitleViewDelegate { view.backgroundColor = .green HY() + + addPagingView() } func HY() { @@ -67,10 +69,11 @@ class AttributedVC: UIViewController, SGPagingTitleViewDelegate { rightBtn.backgroundColor = .orange rightBtn.setTitleColor(.white, for: .normal) rightBtn.titleLabel!.lineBreakMode = .byWordWrapping + rightBtn.titleLabel?.textAlignment = .center rightBtn.titleLabel!.font = UIFont.systemFont(ofSize: 12) view.addSubview(rightBtn) - let rightBtnText = "订阅\n 520" + let rightBtnText = "订阅\n520" let attriStr = NSMutableAttributedString(string: rightBtnText) let dict = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: UIColor.white] let range = NSMakeRange(0, 2) @@ -78,4 +81,73 @@ class AttributedVC: UIViewController, SGPagingTitleViewDelegate { rightBtn.setAttributedTitle(attriStr, for: .normal) } + + func addPagingView() { + view.addSubview(pagingTitleView) + view.addSubview(pagingContentView) + } + + lazy var pagingTitleView: SGPagingTitleView = { + let configure = SGPagingTitleViewConfigure() + configure.indicatorLocation = .Top + configure.indicatorHeight = 5 + + let frame = CGRect.init(x: 0, y: 220, width: UIScreen.width, height: 44) + let titles = ["聊天", "主播", "排行", "贵宾"] + let pagingTitle = SGPagingTitleView(frame: frame, titles: titles, configure: configure) + pagingTitle.delegate = self + + let text = "订阅\n520" + let attriStr = NSMutableAttributedString(string: text) + let dict = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: UIColor.black] + let range = NSMakeRange(0, 2) + attriStr.addAttributes(dict, range: range) + let dict2 = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13), NSAttributedString.Key.foregroundColor: UIColor.black] + let range2 = NSMakeRange(text.count - 3, 3) + attriStr.addAttributes(dict2, range: range2) + + let selectedAttriStr = NSMutableAttributedString(string: text) + let selectedDict = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 17), NSAttributedString.Key.foregroundColor: UIColor.red] + let selectedRange = NSMakeRange(0, 2) + selectedAttriStr.addAttributes(selectedDict, range: selectedRange) + let selectedDict2 = [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13), NSAttributedString.Key.foregroundColor: UIColor.red] + let selectedRange2 = NSMakeRange(text.count - 3, 3) + selectedAttriStr.addAttributes(selectedDict2, range: selectedRange2) + + pagingTitle.setTitle(attributed: attriStr, selectedAttributed: selectedAttriStr, index: 3) + + let imageUrl = "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" + pagingTitle.setBackgroundImage(name: imageUrl, selectedName: nil, index: 1) + return pagingTitle + }() + + lazy var pagingContentView: SGPagingContentScrollView = { + let vc1 = UIViewController() + vc1.view.backgroundColor = .orange + let vc2 = UIViewController() + vc2.view.backgroundColor = .purple + let vc3 = UIViewController() + vc3.view.backgroundColor = .blue + let vc4 = UIViewController() + vc4.view.backgroundColor = .brown + let vcs = [vc1, vc2, vc3, vc4] + + let y: CGFloat = pagingTitleView.frame.maxY + 20 + let tempRect: CGRect = CGRect.init(x: 0, y: y, width: UIScreen.width, height: 200) + let pagingContent = SGPagingContentScrollView(frame: tempRect, parentVC: self, childVCs: vcs) + pagingContent.delegate = self + pagingContent.isAnimated = true + pagingContent.isBounces = true + return pagingContent + }() +} + +extension AttributedVC: SGPagingTitleViewDelegate, SGPagingContentViewDelegate { + func pagingTitleView(titleView: SGPagingTitleView, index: Int) { + pagingContentView.setPagingContentView(index: index) + } + + func pagingContentView(contentView: SGPagingContentView, progress: CGFloat, currentIndex: Int, targetIndex: Int) { + pagingTitleView.setPagingTitleView(progress: progress, currentIndex: currentIndex, targetIndex: targetIndex) + } } diff --git a/SGPagingView/Example/FixedOneVC.swift b/SGPagingView/Example/FixedOneVC.swift index 159a2c9..8a1ec22 100644 --- a/SGPagingView/Example/FixedOneVC.swift +++ b/SGPagingView/Example/FixedOneVC.swift @@ -34,7 +34,7 @@ class FixedOneVC: UIViewController, SGPagingTitleViewDelegate, SGPagingContentVi let frame = CGRect.init(x: 0, y: UIScreen.navBarHeight, width: UIScreen .width, height: 44) - let titles = ["关注", "推荐", "热榜", "免费小说"] + let titles = ["滚动", "内容视图", "最左或最右", "回弹"] let pagingTitle = SGPagingTitleView(frame: frame, titles: titles, configure: configure) pagingTitle.delegate = self view.addSubview(pagingTitle) diff --git a/SGPagingView/Example/FixedTwoVC.swift b/SGPagingView/Example/FixedTwoVC.swift index 935ddc2..c0ba8d2 100644 --- a/SGPagingView/Example/FixedTwoVC.swift +++ b/SGPagingView/Example/FixedTwoVC.swift @@ -27,7 +27,7 @@ class FixedTwoVC: UIViewController, SGPagingTitleViewDelegate, SGPagingContentVi let configure = SGPagingTitleViewConfigure() let frame = CGRect.init(x: 0, y: UIScreen.navBarHeight, width: UIScreen.width, height: 44) - let titles = ["关注", "推荐", "热榜", "免费小说"] + let titles = ["点击", "标题", "内容", "动画切换"] let pagingTitle = SGPagingTitleView(frame: frame, titles: titles, configure: configure) pagingTitle.delegate = self return pagingTitle diff --git a/SGPagingView/ViewController.swift b/SGPagingView/ViewController.swift index e237f75..2ffd104 100644 --- a/SGPagingView/ViewController.swift +++ b/SGPagingView/ViewController.swift @@ -9,7 +9,22 @@ import UIKit class ViewController: UIViewController { @IBOutlet weak var tableView: UITableView! - var dataSource = ["固定样式一(回弹效果)", "固定样式二(动画效果)", "滚动样式(指定下标值)", "富文本样式", "badge 样式", "文字渐变效果", "文字缩放效果", "指示器固定样式(爱奇艺效果)", "指示器动态样式", "指示器遮盖样式", "百度网盘传输界面样式", "悬浮效果", "悬浮效果Pro"] + + var dataSource = [ + ["固定样式一(回弹效果)": FixedOneVC.self], + ["固定样式二(动画效果)": FixedTwoVC.self], + ["滚动样式(指定下标值)": ScrollVC.self], + ["富文本样式": AttributedVC.self], + ["文字渐变效果": GradientEffectVC.self], + ["文字缩放效果": ZoomVC.self], + ["通知消息样式": BadgeVC.self], + ["指示器固定样式(爱奇艺首页效果)": IFixedVC.self], + ["指示器动态样式": IDynamicVC.self], + ["指示器遮盖样式": CoverOneVC.self], + ["百度网盘传输界面样式": CoverTwoVC.self], + ["悬浮效果": SuspensionVC.self], + ["悬浮效果Pro": SuspensionProVC.self] + ] override func viewDidLoad() { super.viewDidLoad() @@ -19,7 +34,6 @@ class ViewController: UIViewController { tableView.tableFooterView = UIView() } - } extension ViewController: UITableViewDataSource { @@ -31,52 +45,16 @@ extension ViewController: UITableViewDataSource { cell.accessoryType = .disclosureIndicator cell.backgroundColor = .clear cell.selectionStyle = .none - cell.textLabel?.text = dataSource[indexPath.row]; + cell.textLabel?.text = dataSource[indexPath.row].keys.first return cell } } extension ViewController: UITableViewDelegate { func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - if indexPath.row == 0 { - let vc = FixedOneVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 1 { - let vc = FixedTwoVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 2 { - let vc = ScrollVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 3 { - let vc = AttributedVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 4 { - let vc = BadgeVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 5 { - let vc = GradientEffectVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 6 { - let vc = ZoomVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 7 { - let vc = IFixedVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 8 { - let vc = IDynamicVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 9 { - let vc = CoverOneVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 10 { - let vc = CoverTwoVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 11 { - let vc = SuspensionVC() - navigationController?.pushViewController(vc, animated: true) - } else if indexPath.row == 12 { - let vc = SuspensionProVC() - navigationController?.pushViewController(vc, animated: true) + let vc = dataSource[indexPath.row].values.first + if let tempVC = vc { + navigationController?.pushViewController(tempVC.init(), animated: true) } } } diff --git a/Sources/Extensions/UIButton+SGPagingView.swift b/Sources/Extensions/UIButton+SGPagingView.swift index d66fdcc..07be869 100644 --- a/Sources/Extensions/UIButton+SGPagingView.swift +++ b/Sources/Extensions/UIButton+SGPagingView.swift @@ -8,7 +8,7 @@ import UIKit -public enum ImageLocation { +@objc public enum ImageLocation: Int { case left, right, top, bottom } @@ -20,7 +20,7 @@ public extension UIButton { /// - parameter location: location of image relative to title /// - parameter space: space between image and title /// - parameter completion: set image and title - func setImage(location: ImageLocation, space: CGFloat, completion: (UIButton) -> ()) { + @objc func setImage(location: ImageLocation, space: CGFloat, completion: (UIButton) -> ()) { completion(self) setImage(location: location, space: space) } @@ -31,7 +31,7 @@ public extension UIButton { /// /// - parameter location: Location of image relative to title /// - parameter space: Space between image and title - func setImage(location: ImageLocation, space: CGFloat) { + @objc func setImage(location: ImageLocation, space: CGFloat) { let imageView_Width = imageView?.frame.size.width let imageView_Height = imageView?.frame.size.height diff --git a/Sources/Extensions/UIScreen+SGPagingView.swift b/Sources/Extensions/UIScreen+SGPagingView.swift index 2f7e8cf..dfed920 100644 --- a/Sources/Extensions/UIScreen+SGPagingView.swift +++ b/Sources/Extensions/UIScreen+SGPagingView.swift @@ -10,16 +10,16 @@ import UIKit public extension UIScreen { /// Gets the size of the screen - static var size: CGSize { return UIScreen.main.bounds.size } + @objc static var size: CGSize { return UIScreen.main.bounds.size } /// Gets the width of the screen - static var width: CGFloat { return UIScreen.main.bounds.size.width } + @objc static var width: CGFloat { return UIScreen.main.bounds.size.width } /// Gets the height of the screen - static var height: CGFloat { return UIScreen.main.bounds.size.height } + @objc static var height: CGFloat { return UIScreen.main.bounds.size.height } /// Gets status bar height - static var statusBarHeight: CGFloat { + @objc static var statusBarHeight: CGFloat { if #available(iOS 13, *) { return (UIApplication.shared.windows.first?.windowScene?.statusBarManager?.statusBarFrame.size.height)! } else { @@ -28,11 +28,11 @@ public extension UIScreen { } /// Gets navigation bar height - static var navBarHeight: CGFloat { return statusBarHeight + 44 } + @objc static var navBarHeight: CGFloat { return statusBarHeight + 44 } /// Gets tab bar height - static var tabBarHeight: CGFloat { return statusBarHeight == 20 ? 49 : 83 } + @objc static var tabBarHeight: CGFloat { return statusBarHeight == 20 ? 49 : 83 } /// Gets bottom safeArea height - static var safeAreaInsetBottom: CGFloat { return statusBarHeight == 20 ? 0 : 34 } + @objc static var safeAreaInsetBottom: CGFloat { return statusBarHeight == 20 ? 0 : 34 } } diff --git a/Sources/PagingContent/SGPagingContentCollectionView.swift b/Sources/PagingContent/SGPagingContentCollectionView.swift index 89e454a..8042a72 100644 --- a/Sources/PagingContent/SGPagingContentCollectionView.swift +++ b/Sources/PagingContent/SGPagingContentCollectionView.swift @@ -9,11 +9,12 @@ import UIKit public class SGPagingContentCollectionView: SGPagingContentView { - public init(frame: CGRect, parentVC: UIViewController, childVCs: [UIViewController]) { + @objc public init(frame: CGRect, parentVC: UIViewController, childVCs: [UIViewController]) { super.init(frame: frame) parentViewController = parentVC childViewControllers = childVCs + addSubview(collectionView) } required init?(coder: NSCoder) { @@ -21,13 +22,13 @@ public class SGPagingContentCollectionView: SGPagingContentView { } public override var isScrollEnabled: Bool { - willSet{ + willSet { collectionView.isScrollEnabled = newValue } } public override var isBounces: Bool { - willSet{ + willSet { collectionView.bounces = newValue } } @@ -46,18 +47,17 @@ public class SGPagingContentCollectionView: SGPagingContentView { private lazy var collectionView: UICollectionView = { let flowLayout = UICollectionViewFlowLayout() - flowLayout.itemSize = self.bounds.size + flowLayout.itemSize = bounds.size flowLayout.minimumLineSpacing = 0 flowLayout.minimumInteritemSpacing = 0 flowLayout.scrollDirection = .horizontal - let rect = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height) - let tempCollectionView = UICollectionView(frame: rect, collectionViewLayout: flowLayout) + let tempCollectionView = UICollectionView(frame: bounds, collectionViewLayout: flowLayout) tempCollectionView.showsVerticalScrollIndicator = false tempCollectionView.showsHorizontalScrollIndicator = false tempCollectionView.isPagingEnabled = true tempCollectionView.bounces = isBounces - tempCollectionView.backgroundColor = UIColor.white + tempCollectionView.backgroundColor = .white tempCollectionView.delegate = self tempCollectionView.dataSource = self tempCollectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellID) diff --git a/Sources/PagingContent/SGPagingContentScrollView.swift b/Sources/PagingContent/SGPagingContentScrollView.swift index c3d5b9b..3f6ffde 100644 --- a/Sources/PagingContent/SGPagingContentScrollView.swift +++ b/Sources/PagingContent/SGPagingContentScrollView.swift @@ -9,11 +9,12 @@ import UIKit public class SGPagingContentScrollView: SGPagingContentView { - public init(frame: CGRect, parentVC: UIViewController, childVCs: [UIViewController]) { + @objc public init(frame: CGRect, parentVC: UIViewController, childVCs: [UIViewController]) { super.init(frame: frame) parentViewController = parentVC childViewControllers = childVCs + addSubview(scrollView) } required init?(coder: NSCoder) { @@ -21,13 +22,13 @@ public class SGPagingContentScrollView: SGPagingContentView { } public override var isScrollEnabled: Bool { - willSet{ + willSet { scrollView.isScrollEnabled = newValue } } public override var isBounces: Bool { - willSet{ + willSet { scrollView.bounces = newValue } } @@ -46,7 +47,7 @@ public class SGPagingContentScrollView: SGPagingContentView { private lazy var scrollView: UIScrollView = { let tempScrollView = UIScrollView() - tempScrollView.frame = self.bounds + tempScrollView.frame = bounds tempScrollView.bounces = isBounces tempScrollView.delegate = self tempScrollView.isPagingEnabled = true diff --git a/Sources/PagingContent/SGPagingContentView.swift b/Sources/PagingContent/SGPagingContentView.swift index 24087eb..b65c35d 100644 --- a/Sources/PagingContent/SGPagingContentView.swift +++ b/Sources/PagingContent/SGPagingContentView.swift @@ -10,17 +10,19 @@ import UIKit public class SGPagingContentView: UIView { /// SGPagingContentView 的代理 - public weak var delegate: SGPagingContentViewDelegate? + @objc public weak var delegate: SGPagingContentViewDelegate? - /// 切换内容视图的子视图时,是否需要动画效果,默认为 false - public var isAnimated = false + /// 内容视图的子视图是否需要动画效果,默认为 false + /// + /// 为 true 时,点击标题如果指示器出现异常跳动,设置 isBounces = true,即可避免这个问题 + @objc public var isAnimated = false /// 内容视图的子视图是否可以左右滚动,默认为 true;为 false 时,不需要设置代理及其方法 - public var isScrollEnabled: Bool = true + @objc public var isScrollEnabled: Bool = true - /// 当内容视图的子视图滚动到最左边、最右边时,是否需要回弹效果,默认为 false - public var isBounces: Bool = false + /// 当内容视图的子视图滚动到最左边或最右边时,是否需要回弹效果,默认为 false + @objc public var isBounces: Bool = false /// 根据外界提供的下标值设置内容视图对应的子视图 - public func setPagingContentView(index: Int){} + @objc public func setPagingContentView(index: Int){} } diff --git a/Sources/PagingTitle/SGPagingTitleView.swift b/Sources/PagingTitle/SGPagingTitleView.swift index d403a4a..301361e 100644 --- a/Sources/PagingTitle/SGPagingTitleView.swift +++ b/Sources/PagingTitle/SGPagingTitleView.swift @@ -8,20 +8,13 @@ import UIKit -private class PagingTitleButton: UIButton { - override var isHighlighted: Bool { - set {} - get {return false} - } -} - @objc public protocol SGPagingTitleViewDelegate: NSObjectProtocol { /// 获取当前选中标题下标值 @objc optional func pagingTitleView(titleView: SGPagingTitleView, index: Int) } public class SGPagingTitleView: UIView { - public init(frame: CGRect, titles:[String], configure: SGPagingTitleViewConfigure) { + @objc public init(frame: CGRect, titles:[String], configure: SGPagingTitleViewConfigure) { super.init(frame: frame) backgroundColor = UIColor.white.withAlphaComponent(0.77) @@ -38,16 +31,14 @@ public class SGPagingTitleView: UIView { } /// SGPagingTitleView 的代理 - public weak var delegate: SGPagingTitleViewDelegate? + @objc public weak var delegate: SGPagingTitleViewDelegate? /// 选中标题的下标,默认为 0 - public var index: Int = 0 + @objc public var index: Int = 0 /// 重置选中标题的下标 - public var resetIndex: Int? { - willSet { - btn_action(button: tempBtns[newValue!]) - } + @objc public func reset(index: Int) { + btn_action(button: tempBtns[index]) } @@ -56,7 +47,7 @@ public class SGPagingTitleView: UIView { private var configure: SGPagingTitleViewConfigure! private var allBtnTextWidth: CGFloat = 0.0 private var allBtnWidth: CGFloat = 0.0 - private var tempBtns = [PagingTitleButton]() + private var tempBtns = [SGPagingTitleButton]() private var tempBtn: UIButton? private var separators = [UIView]() private var previousIndexValue: Int? @@ -93,32 +84,7 @@ public class SGPagingTitleView: UIView { private lazy var indicator: UIView = { let tempIndicator = UIView() tempIndicator.backgroundColor = configure.indicatorColor - - if configure.indicatorType == .Cover { - if configure.indicatorHeight >= frame.size.height { - tempIndicator.frame.origin.y = 0 - tempIndicator.frame.size.height = frame.size.height - } else { - tempIndicator.frame.origin.y = 0.5 * (frame.size.height - configure.indicatorHeight) - tempIndicator.frame.size.height = configure.indicatorHeight - } - tempIndicator.layer.borderWidth = configure.indicatorBorderWidth - tempIndicator.layer.borderColor = configure.indicatorBorderColor.cgColor - } else { - if configure.indicatorHeight >= frame.size.height { - tempIndicator.frame.origin.y = 0 - tempIndicator.frame.size.height = frame.size.height - } else { - tempIndicator.frame.origin.y = frame.size.height - configure.indicatorToBottomDistance - configure.indicatorHeight - tempIndicator.frame.size.height = configure.indicatorHeight - } - } - - if configure.indicatorCornerRadius > 0.5 * tempIndicator.frame.size.height { - tempIndicator.layer.cornerRadius = 0.5 * tempIndicator.frame.size.height - } else { - tempIndicator.layer.cornerRadius = configure.indicatorCornerRadius - } + P_layoutIndicator(tempIndicator: tempIndicator) return tempIndicator }() @@ -129,61 +95,68 @@ public class SGPagingTitleView: UIView { } } + // MARK: 外部方法 public extension SGPagingTitleView { - /// 根据 SGPagingContentView 子视图滚动去修改标题选中样式 - func setPagingTitleView(progress: CGFloat, currentIndex: Int, targetIndex: Int) { + /// 根据 SGPagingContentView 子视图的滚动而去修改标题选中样式 + @objc func setPagingTitleView(progress: CGFloat, currentIndex: Int, targetIndex: Int) { p_setPagingTitleView(progress: progress, currentIndex: currentIndex, targetIndex: targetIndex) } /// 根据标题下标值重置标题文字 - func resetTitle(text: String, index: Int) { + @objc func resetTitle(text: String, index: Int) { p_resetTitle(text: text, index: index) } /// 根据标题下标值设置标题的 attributed 属性 - func setTitle(attributed: NSAttributedString, selectedAttributed: NSAttributedString, index: Int) { + @objc func setTitle(attributed: NSAttributedString, selectedAttributed: NSAttributedString, index: Int) { p_setTitle(attributed: attributed, selectedAttributed: selectedAttributed, index: index) } /// 重置指示器颜色 - func resetIndicator(color: UIColor) { + @objc func resetIndicator(color: UIColor) { p_resetIndicator(color: color) } /// 重置标题颜色(color:普通状态下标题颜色、selectedColor:选中状态下标题颜色) - func resetTitle(color: UIColor, selectedColor: UIColor) { + @objc func resetTitle(color: UIColor, selectedColor: UIColor) { p_resetTitle(color: color, selectedColor: selectedColor) } /// 根据标题下标值添加对应的 badge - func addBadge(index: Int) { + @objc func addBadge(index: Int) { p_addBadge(index: index) } /// 根据标题下标值添加对应的 badge 及其文字 - func addBadge(text: String, index: Int) { + @objc func addBadge(text: String, index: Int) { p_addBadge(text: text, index: index) } /// 根据标题下标值移除对应的 badge - func removeBadge(index: Int) { + @objc func removeBadge(index: Int) { p_removeBadge(index: index) } - /// 设置标题图片和位置(支持本地和网络图片) - func setImage(names: Array, location: ImageLocation, spacing: CGFloat) { + /// 设置标题图片及相对文字的位置(支持本地和网络图片) + @objc func setImage(names: Array, location: ImageLocation, spacing: CGFloat) { p_setImage(names: names, location: location, spacing: spacing) } - /// 根据标题下标值设置标题图片和位置(支持本地和网络图片) - func setImage(name: String, location: ImageLocation, spacing: CGFloat, index: Int) { + /// 根据标题下标值设置标题图片及相对文字的位置(支持本地和网络图片) + @objc func setImage(name: String, location: ImageLocation, spacing: CGFloat, index: Int) { p_setImage(name: name, location: location, spacing: spacing, index: index) } + + /// 根据标题下标值设置标题背景图片(支持本地和网络图片) + @objc func setBackgroundImage(name: String, selectedName: String?, index: Int) { + P_setBackgroundImage(name: name, selectedName: selectedName, index: index) + } } + // MARK: 修改指示器颜色、标题颜色、标题文字相关方法 -extension SGPagingTitleView { +private extension SGPagingTitleView { /// 根据标题下标值重置标题文字 func p_resetTitle(text: String, index: Int) { let btn: UIButton = tempBtns[index] @@ -202,6 +175,8 @@ extension SGPagingTitleView { /// 根据标题下标值设置标题的 attributed 属性 func p_setTitle(attributed: NSAttributedString, selectedAttributed: NSAttributedString, index: Int) { let btn: UIButton = tempBtns[index] + btn.titleLabel?.lineBreakMode = .byCharWrapping + btn.titleLabel?.textAlignment = .center btn.setAttributedTitle(attributed, for: .normal) btn.setAttributedTitle(selectedAttributed, for: .selected) } @@ -226,7 +201,7 @@ extension SGPagingTitleView { } // MARK: 设置标题图片相关方法 -extension SGPagingTitleView { +private extension SGPagingTitleView { /// Set title image /// /// Support local and network images @@ -267,10 +242,35 @@ extension SGPagingTitleView { let btn = tempBtns[index] setImage(btn: btn, imageName: name, location: location, spacing: spacing) } + + /// 设置标题背景图片 + func P_setBackgroundImage(name: String, selectedName: String?, index: Int) { + let btn: UIButton = tempBtns[index] + btn.setTitleColor(.clear, for: .normal) + btn.setTitleColor(.clear, for: .selected) + + if name.hasPrefix("http") { + loadImage(urlString: name) { (image) in + btn.setBackgroundImage(image, for: .normal) + } + } else { + btn.setBackgroundImage(UIImage.init(named: name), for: .normal) + } + + if let tempSelectedName = selectedName { + if tempSelectedName.hasPrefix("http") { + loadImage(urlString: tempSelectedName) { (image) in + btn.setBackgroundImage(image, for: .selected) + } + } else { + btn.setBackgroundImage(UIImage.init(named: tempSelectedName), for: .selected) + } + } + } } // MARK:添加、移除 Badge 相关方法 -extension SGPagingTitleView { +private extension SGPagingTitleView { /// 根据标题下标添加对应的 badge func p_addBadge(index: Int) { DispatchQueue.main.asyncAfter(deadline: .now() + 0.02) { @@ -322,7 +322,7 @@ extension SGPagingTitleView { } } // MARK: 用于修改标题选中样式 -extension SGPagingTitleView { +private extension SGPagingTitleView { /// 修改标题选中样式 func p_setPagingTitleView(progress: CGFloat, currentIndex: Int, targetIndex: Int) { let currentBtn = tempBtns[currentIndex] @@ -945,7 +945,11 @@ private extension SGPagingTitleView { } addTitleBtns() if configure.showIndicator { - scrollView.insertSubview(indicator, at: 0) + if configure.indicatorLocation == .Default { + scrollView.insertSubview(indicator, at: 0) + } else { + scrollView.addSubview(indicator) + } } } @@ -959,7 +963,7 @@ private extension SGPagingTitleView { allBtnWidth = CGFloat(ceilf(Float(allBtnWidth))) for idx in 0..= frame.size.height { + tempIndicator.frame.origin.y = 0 + tempIndicator.frame.size.height = frame.size.height + } else { + tempIndicator.frame.origin.y = 0.5 * (frame.size.height - configure.indicatorHeight) + tempIndicator.frame.size.height = configure.indicatorHeight + } + tempIndicator.layer.borderWidth = configure.indicatorBorderWidth + tempIndicator.layer.borderColor = configure.indicatorBorderColor.cgColor + } else { + if configure.indicatorHeight >= frame.size.height { + tempIndicator.frame.origin.y = 0 + tempIndicator.frame.size.height = frame.size.height + } else { + tempIndicator.frame.origin.y = frame.size.height - configure.indicatorToBottomDistance - configure.indicatorHeight + tempIndicator.frame.size.height = configure.indicatorHeight + } + } + + if configure.indicatorCornerRadius > 0.5 * tempIndicator.frame.size.height { + tempIndicator.layer.cornerRadius = 0.5 * tempIndicator.frame.size.height + } else { + tempIndicator.layer.cornerRadius = configure.indicatorCornerRadius + } + } +} + // MARK: 内部公共方法抽取 private extension SGPagingTitleView { @@ -1278,3 +1313,9 @@ private extension SGPagingTitleView { } +private class SGPagingTitleButton: UIButton { + override var isHighlighted: Bool { + set {} + get {return false} + } +} diff --git a/Sources/PagingTitle/SGPagingTitleViewConfigure.swift b/Sources/PagingTitle/SGPagingTitleViewConfigure.swift index ba22b94..79bc43a 100644 --- a/Sources/PagingTitle/SGPagingTitleViewConfigure.swift +++ b/Sources/PagingTitle/SGPagingTitleViewConfigure.swift @@ -9,136 +9,145 @@ import UIKit /// 指示器样式 -public enum IndicatorType: Int { +@objc public enum IndicatorType: Int { case Default, Cover, Fixed, Dynamic } /// 指示器随内容子视图滚动而滚动的样式 -public enum IndicatorScrollStyle: Int { +@objc public enum IndicatorScrollStyle: Int { case Default, Half, End } +/// 指示器添加到父视图上的层级位置,(Default:标题之下,Top:标题之上) +@objc public enum IndicatorLocation: Int { + case Default, Top +} + + public class SGPagingTitleViewConfigure: NSObject { // MARK: SGPagingTitleView 相关属性 /// SGPagingTitleView 固定样式下,是否需要回弹效果,默认为 false - public var bounce = false + @objc public var bounce = false /// SGPagingTitleView 滚动样式下,是否需要回弹效果,默认为 true - public var bounces = true + @objc public var bounces = true /// SGPagingTitleView 固定样式下标题是否均分布局,默认为 true - public var equivalence = true + @objc public var equivalence = true /// SGPagingTitleView 是否显示底部分割线,默认为 true - public var showBottomSeparator = true + @objc public var showBottomSeparator = true /// SGPagingTitleView 底部分割线颜色,默认为 lightGray - public var bottomSeparatorColor: UIColor = .lightGray + @objc public var bottomSeparatorColor: UIColor = .lightGray // MARK: 标题相关属性 /// 标题文字大小,默认为 .systemFont(ofSize: 15) - public var font: UIFont = .systemFont(ofSize: 15) + @objc public var font: UIFont = .systemFont(ofSize: 15) /// 标题文字选中时大小,默认为 .systemFont(ofSize: 15),一旦设置此属性,textZoom 属性将不起作用 - public var selectedFont: UIFont = .systemFont(ofSize: 15) + @objc public var selectedFont: UIFont = .systemFont(ofSize: 15) /// 普通状态下标题颜色,默认为 black - public var color: UIColor = .black + @objc public var color: UIColor = .black /// 选中状态下标题颜色,默认为 red - public var selectedColor: UIColor = .red + @objc public var selectedColor: UIColor = .red /// 标题文字是否具有渐变效果,默认为 false - public var gradientEffect = false + @objc public var gradientEffect = false /// 标题文字是否具有缩放效果,默认为 false。为 true 时,请与 textZoomRatio 属性结合使用,否则不起作用。(特别需要注意的是:此属性为 true 时,与 indicatorScrollStyle 属性不兼容) - public var textZoom = false + @objc public var textZoom = false /// 标题文字缩放比,默认为 0.0f,取值范围 0.0 ~ 1.0f。请与 textZoom = true 时结合使用,否则不起作用 - public var textZoomRatio: CGFloat = 0.0 + @objc public var textZoomRatio: CGFloat = 0.0 /// 标题额外需要增加的宽度,默认为 20.0(标题宽度 = 文字宽度 + additionalWidth) - public var additionalWidth: CGFloat = 20.0 + @objc public var additionalWidth: CGFloat = 20.0 // MARK: 指示器相关属性 /// 是否显示指示器,默认为 true - public var showIndicator = true + @objc public var showIndicator = true /// 指示器颜色,默认为 red - public var indicatorColor: UIColor = .red + @objc public var indicatorColor: UIColor = .red /// 指示器高度,默认为 2.0f - public var indicatorHeight: CGFloat = 2.0 + @objc public var indicatorHeight: CGFloat = 2.0 /// 指示器动画时间,默认为 0.1f,取值范围 0.0 ~ 0.3f - public var indicatorAnimationTime: TimeInterval = 0.1 + @objc public var indicatorAnimationTime: TimeInterval = 0.1 /// 指示器圆角大小,默认为 0.0f - public var indicatorCornerRadius: CGFloat = 0.0 + @objc public var indicatorCornerRadius: CGFloat = 0.0 /// 指示器 Cover 样式下的边框宽度,默认为 0.0f - public var indicatorBorderWidth: CGFloat = 0.0 + @objc public var indicatorBorderWidth: CGFloat = 0.0 /// 指示器 Cover 样式下的边框颜色,默认为 clear - public var indicatorBorderColor: UIColor = .clear + @objc public var indicatorBorderColor: UIColor = .clear /// 指示器 Cover、Default 样式下额外增加的宽度,默认为 0.0f;指示器默认宽度等于标题文字宽度 - public var indicatorAdditionalWidth: CGFloat = 0.0 + @objc public var indicatorAdditionalWidth: CGFloat = 0.0 /// 指示器 Fixed 样式下的宽度,默认为 20.0f;最大宽度并没有做限制,请根据实际情况妥善设置 - public var indicatorFixedWidth: CGFloat = 20.0 + @objc public var indicatorFixedWidth: CGFloat = 20.0 /// 指示器 Dynamic 样式下的宽度,默认为 20.0f;最大宽度并没有做限制,请根据实际情况妥善设置 - public var indicatorDynamicWidth: CGFloat = 20.0 + @objc public var indicatorDynamicWidth: CGFloat = 20.0 /// 指示器距 SGPagingTitleView 底部间的距离,默认为 0.0f - public var indicatorToBottomDistance: CGFloat = 0.0 + @objc public var indicatorToBottomDistance: CGFloat = 0.0 /// 指示器样式,默认为 Default - public var indicatorType: IndicatorType = .Default + @objc public var indicatorType: IndicatorType = .Default /// 滚动内容视图时,指示器切换样式,默认为 Default。(特别需要注意的是:此属性与 textZoom = true 时不兼容) - public var indicatorScrollStyle: IndicatorScrollStyle = .Default + @objc public var indicatorScrollStyle: IndicatorScrollStyle = .Default + /// 指示器添加在父视图上的层级位置,默认为 Default + @objc public var indicatorLocation: IndicatorLocation = .Default + // MARK: 标题间分割线相关属性 /// 是否显示标题间分割线,默认为 false - public var showSeparator = false + @objc public var showSeparator = false /// 标题间分割线颜色,默认为 red - public var separatorColor: UIColor = .red + @objc public var separatorColor: UIColor = .red /// 标题间分割线额外减少的长度,默认为 20.0f - public var separatorAdditionalReduceLength: CGFloat = 20.0 + @objc public var separatorAdditionalReduceLength: CGFloat = 20.0 // MARK: badge 相关属性,默认所在位置以标题文字右上角为起点 /// badge 颜色,默认为 red - public var badgeColor: UIColor = .red + @objc public var badgeColor: UIColor = .red /// badge 的高,默认为 7.0f - public var badgeHeight: CGFloat = 7.0 + @objc public var badgeHeight: CGFloat = 7.0 /// badge 的偏移量,默认为 zero - public var badgeOff: CGPoint = .zero + @objc public var badgeOff: CGPoint = .zero /// badge 的文字颜色,默认为 white(只针对:addBadge(text:index:) 方法有效) - public var badgeTextColor: UIColor = .white + @objc public var badgeTextColor: UIColor = .white /// badge 的文字大小,默认为 .systemFont(ofSize: 10)(只针对:addBadge(text:index:) 方法有效) - public var badgeTextFont: UIFont = .systemFont(ofSize: 10) + @objc public var badgeTextFont: UIFont = .systemFont(ofSize: 10) /// badge 额外需要增加的宽度,默认为 10.0f(只针对:addBadge(text:index:) 方法有效) - public var badgeAdditionalWidth: CGFloat = 10.0 + @objc public var badgeAdditionalWidth: CGFloat = 10.0 /// badge 边框的宽度,默认为 0(只针对:addBadge(text:index:) 方法有效) - public var badgeBorderWidth: CGFloat = 0.0 + @objc public var badgeBorderWidth: CGFloat = 0.0 /// badge 边框的颜色,默认为 clear(只针对:addBadge(text:index:) 方法有效) - public var badgeBorderColor: UIColor = .clear + @objc public var badgeBorderColor: UIColor = .clear /// badge 圆角大小,默认为 5.0f(只针对:addBadge(text:index:) 方法有效) - public var badgeCornerRadius: CGFloat = 5.0 + @objc public var badgeCornerRadius: CGFloat = 5.0 }