CollectioniOS聚合了项目搭建的一些基本模块,节约开发者时间,协助项目的快速搭建,能够满足一个项目的基本实现。
github地址:https://github.com/usernameyangyan/CollectioniOS
框架的引入
- pod 'CollectioniOS','~>1.1.3'
更新说明
v1.1.3
1.解决Toast连续点击时多个Toast同时显示
2.解决库中的默认图片显示不出来问题
v1.0.9
1.增加DataManager,对Http数据请求、UserDefaults、File、SQLite的整合使用,移除YYHttpUtils
2.增加YYTagView
3.增加MVP
v1.0.8(增加以下功能)
1.应用基本配置:应用内国际化语言配置、应用名称国际化。
2.UTTableView/UICollectionView的封装以及通用用法。
3.YYNavigationBar:顶部导航栏的封装以及使用。
4.YYAutoLayout:自动布局的使用。
5.YYTabBar:底部分页导航栏的封装以及使用。
6.YYPageView的封装以及使用。
7.YYPageMenu:滑动菜单的封装以及使用。
8.YYRefresh:下拉刷新/上拉加载更多控件的封装以及使用。
9.YYImageLoader:网络图片加载(可加载普通网络图片、gif,可设置缓存时间、缓存大小)。
10.YYDialog:通用提示框的封装、Toast的封装
11.YYHttpUtils:网络请求的封装(普通的网络请求、文件下载、图片上传)
12.YYDataShowView:数据加载显示样式(没有数据、网络错误、正在加载)
注意:由于项目的网络请求是使用了http,在使用之前需要配置项目Info.plist,在其中加上App Transport Security Settings->Allow Arbitrary Loads(设置为YES)
项目介绍
整体效果
文章目录
1.应用基本配置
- 应用内国际化语言配置
- 应用名称国际化
2.UTTableView的封装使用
- 通过YYTableViewManager对UITableView进行统一管理使用
- 自定义分割线
- 列表增加头部视图
- 实现ExpandableList的效果
- Cell实现自适应高度
- UITableView增加可伸缩头部
- 实现Cell滑动删除
- 多布局的实现
- UITableView实现分类效果
3.UICollectionView/UIScrollView的基础使用
- UICollectionView通用布局,可快速设置行数、高度
- UICollectionView增加可伸缩头部
- UIScrollView增加可伸缩头部
4.YYNavigationBar:顶部导航栏
- YYNavigationBar的封装使用
5.YYAutoLayout:自动布局
- YYAutoLayout的简单使用
6.YYTabBar:底部分页导航栏
- TabBar的基本样、自定义选中颜色、默认TabBar下标、点击弹簧效果
- TabBar和NavigationBar结合使用
- TabBar不规则排序以及自定义点击事件
- 背景颜色效果(不带title)、背景颜色带有弹簧选中效果(不带title)、背景颜色突出显示(不带title)、暗示用户点击
- TabBar默认提示框(TabBarBadgeValue内容设置、提示颜色、隐藏)
- 自定义TabBarItemView,可设置字体颜色、图片颜色、设置自定义提示框、提示动作
7.YYPageView:图片轮播
- YYPageView的封装使用
8.YYPageMenu:滑动菜单
- YYPageMenu的封装使用
9.YYRefresh:下拉刷新/上拉加载更多
- 默认下拉刷新/上拉加载更多样式
- 自定义下拉刷新/上拉加载更多样式
10.YYImageLoader:网络图片加载
- 加载普通图片
- 加载gif图
- 自定义加载图片的参数
11.YYDialog:通用提示框
- 提示框的使用
- 加载框的使用
- Toast提示
12.DataManager的使用(Http、UserDefaults、File、SQLite)
- Http
- UserDefaults
- File
- SQLite
13.YYDataShowView:数据加载显示页面
- 通用数据加载提示框的使用
14. YYTagView
15. MVP
16.通用工具类
- 通用工具的使用
具体使用
一、应用基本配置
1.应用内国际化语言配置
实现流程:
1.在项目创建一个Strings File 命名为 Localizable.strings
2.选择Localizable.strings文件 点击localizaiton,选择所需语种
3.其中第2点显示的语种如果没有所需的可以点击项目->PROJECT下面的文件->info->找到Localizations添加
4.使用InternationalUtils类进行内容获取和系统语言切换:
(1)在AppDelegate中通过InternationalUtils.getInstance.initUserLanguage()进行初始化
(2)通过InternationalUtils.getInstance.getString(name)获取Localizable.string字符串对应的内容
(3)通过InternationalUtils.getInstance.setLanguage(LanguageType,rootViewController)进行语言切换,其中注意的是需要传入根Controller
(4)通过InternationalUtils.getCurrentLanguage()获取当前语言
2.应用名称国际化
(1)创建Strings File文件,并命名为InfoPlist.strings
(2)选中创建好的文件,点击右侧Localize,勾选所需语言
(3)配置InfoPlist.strings:CFBundleDisplayName =
二、UTTableView的封装使用
1.YYTableViewManager使用
-
通过YYTableViewManager管理UITableView:
//把UITableView设置给YYTableViewManager进行管理使用 let manager = YYTableViewManager(tableView: self.tableView)
-
YYTableViewManager使用组成,基本包含YYTableViewSection(UITabView每组item的头部)、Cell的构成:YYTableViewItem、YYTableViewCell
-
YYTableViewManager
属性 | 作用 |
---|---|
register(_ nibClass: AnyClass, _ item: AnyClass, _ bundle: Bundle = Bundle.main | 注册YYTabViewCell和YYTabViewItem |
numberOfSections(in _: UITableView) | 当前Section的下标 |
numberOfSections(in _: UITableView) | 当前Section的下标 |
add(section: YYTableViewSection) | 增加Section头部视图 |
remove(section: Any) | 移除Section头部视图 |
removeAllSections() | 移除所有Section头部视图 |
reloadData() | 重新加载UITabView数据 |
- YYTableViewSection
属性 | 作用 |
---|---|
headerHeight | 头部视图高度 |
footerHeight | 尾部视图高度 |
init() | 使用默认的头部视图,如果不设定头部任何参数就默认是不显示的 |
init(headerView: UIView!) | 增加自定义头部视图 |
init(footerView: UIView?) | 增加自定义尾部视图 |
init(headerView: UIView?, footerView: UIView?) | 增加自定义头部视图和尾部视图 |
add(item: YYTableViewItem) | 增加头视图下面的item |
remove(item: YYTableViewItem) | 移除头部视图下面的item |
removeAllItems() | 移除头视图下面的所有item |
replaceItemsFrom(array: [YYTableViewItem]!) | 替换头部视图下面的所有item |
insert(_ item: YYTableViewItem!, afterItem: YYTableViewItem, animate: UITableView.RowAnimation = .automatic) | 在某个item后面插入新的item |
insert(_ items: [YYTableViewItem], afterItem: YYTableViewItem, animate: UITableView.RowAnimation = .automatic) | 在某个item后面插入item数组 |
delete(_ itemsToDelete: [YYTableViewItem], animate: UITableView.RowAnimation = .automatic) | 删除头部视图中某个item |
reload(_ animation: UITableView.RowAnimation) | 重新加载Section组下的数据 |
- YYTableViewCell
属性 | 作用 |
---|---|
item | 在register时和Cell绑定的YYTableItem,主要是数据的传递 |
cellWillAppear() | Cell显示的时候会调用这个回调 |
cellDidDisappear() | Cell消失时会调用这个回调 |
setSelected() | Cell设置选择状态 |
- YYTableViewItem
属性 | 作用 |
---|---|
tableViewManager | 绑定的YYTableViewManager |
section | 绑定的YYTableViewSection |
cellTitle | 设定默认Cell标题的字段 |
cellHeight | Cell的高度 |
cellStyle | Cell的样式 |
func setSelectionHandler(selectHandler: YYTableViewItemBlock?) | Item的点击事件回调 |
setDeletionHandler(deletionHandler: YYTableViewItemBlock?) | Item的删除事件回调 |
separatorInset | 分割线内边距 |
editingStyle | Item的编辑状态 |
isHideSeparator | Item是否隐藏分割线 |
separatorLeftMargin | 分割线外边距 |
indexPath | Item的下标 |
reload(_ animation: UITableView.RowAnimation) | Item数据重新加载 |
delete(_ animation: UITableView.RowAnimation = .automatic) | Item数据的删除 |
updateHeight() | 更新高度 |
autoHeight() | 自动计算高度 |
-
基本用法:
//初始化Manager let manager = YYTableViewManager(tableView: self.tableView) //增加一个头部视图 let section = YYTableViewSection() manager.add(section: section) //注册YYTableViewCell以及YYTableViewItem manager.register(CommonTableViewCell.self, CommonTableItem.self) //Section增加item section.add(item: item) manager.reloadData()
-
自定义YYTableViewCell和YYTableViewItem
class CommonTableItem:YYTableViewItem{ //自定义一些数据结构 var desc: String! //自定义高度 override init() { super.init() cellHeight=30 } } class CommonTableViewCell:YYTableViewCell{ override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) } required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } // cell即将出现在屏幕中的回调方法 在这个方法里面赋值 override func cellWillAppear() { let item = self.item as! CommonTableItem } }
-
自定义分割线
在自定义YYTableViewCell中重写以下方法 override func draw(_ rect: CGRect) { //获取绘图上下文 guard let context = UIGraphicsGetCurrentContext() else { return } //#FF4500 context.setStrokeColor(UIColor.colorWithHexString("#D2D3D5").cgColor) context.stroke(CGRect(x:0, y: rect.size.height, width: rect.size.width, height:1)) }
-
列表增加头部视图
for i in 0 ... 8 { let headerView:SelectionHeader=SelectionHeader.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 40)) headerView.setContent(con: "Header " + String(i)) let section = YYTableViewSection.init(headerView: headerView) manager.add(section: section) for j in 0 ... 4 { section.add(item: YYTableViewItem(title: "Header " + String(i) + " Row " + String(j))) } }
-
实现ExpandableList的效果
1.实现YYExpandTreeCellItem 2.代码实现 // level 0 let item0 = ExpanableListItem1() item0.level = 0 section.add(item: item0) // 如果isExpand为true,则下一级的item(也就是item1)必须加入section item0.isExpand = true // level 1 for _ in 0 ..< 3 { let item1 = ExpanableListItem2() // level仅用于记录层级,可以不赋值 item1.level = 1 item1.isExpand = false section.add(item: item1) item0.arrNextLevel.append(item1) // level 2 for _ in 0 ..< 3 { let item2 = ExpanableListItem3() // 如果isExpand为false,则后面就不用把item加入section item2.isExpand = false item1.arrNextLevel.append(item2) } }
-
Cell实现自适应高度
let item = CommonTableItem() item.desc=str as? String item.autoHeight(manager)//自适应高度设置语句 section.add(item: item)
-
UITableView增加可伸缩头部
1.实现YYStretchyHeaderView(在自定义头部的时候使用约束布局需要特别注意,如果约束布局出现问题会导致伸缩出现问题) 2.tableView.addSubview(ScaleHeaderView(frame: self.view.bounds))
-
实现Cell滑动删除
for _ in 0 ..< 20 { let item = CommonTableItem() item.desc="左滑可删除item" item.editingStyle = .delete//设置编辑状态为删除 section.add(item: item) //设置删除监听 item.setDeletionHandler(deletionHandler: { [weak self] (item) in self?.deleteConfirm(item: item as! CommonTableItem) }) }
-
多布局的实现
let section = YYTableViewSection() manager.add(section: section) manager.register(PictureCell.self, PictureItem.self) manager.register(TextCell.self, TextItem.self) for index in 0...30{ if(index%2==0){ let picture = PictureItem() picture.content="" picture.autoHeight(manager) section.add(item: picture) }else{ let textItem = TextItem() textItem.content="" textItem.autoHeight(manager) section.add(item: textItem) } }
-
UITableView实现分类效果
具体实现请看demo代码实现
三、UICollectionView/UIScrollView的基础使用
1. UICollectionView的快速使用
- CommonCollectionViewLayout
属性 | 作用 |
---|---|
init(lineSpacing: CGFloat, columnSpacing: CGFloat, sectionInsets: UIEdgeInsets) | 布局初始化,可设置行间距、列间距、外框边距 |
- CommonCollectionViewLayoutDelegate
属性 | 作用 |
---|---|
columnOfLayout(_ collectionView: UICollectionView) | 设置UICollectionView的列数 |
itemHeight(_ collectionView: UICollectionView, layout commonCollectionViewLayout: CommonCollectionViewLayout, heightForItemAt indexPath: IndexPath) | 设置item的高度 |
使用步骤
-
(1)设置CommonCollectionViewLayout
let flowLayout = CommonCollectionViewLayout.init(lineSpacing: 10, columnSpacing:10, sectionInsets: UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)) flowLayout!.delegate=self collectionView=UICollectionView(frame: self.view.frame, collectionViewLayout: self.flowLayout!) collectionView!.dataSource=self self.collectionView!.delegate=self //注册cell self.collectionView!.register(CommonUICollectionViewCell.classForCoder(), forCellWithReuseIdentifier: reuseidentifier)
-
(1)实现CommonCollectionViewLayoutDelegate
extension CommonUICollectionViewController:CommonCollectionViewLayoutDelegate,UICollectionViewDelegate, UICollectionViewDataSource{ func columnOfLayout(_ collectionView: UICollectionView) -> Int { code } func itemHeight(_ collectionView: UICollectionView, layout commonCollectionViewLayout: CommonCollectionViewLayout, heightForItemAt indexPath: IndexPath) -> CGFloat { code } }
2. UICollectionView/UIScrollView增加可伸缩头部
请参照上面UITableView的用法
四、YYNavigationBar:顶部导航栏
1.YYNavigationBar基本属性
属性 | 作用 |
---|---|
setHidden(...) | 隐藏NavigationBar |
setAlpha(...) | 设置NavigationBar的透明度 |
setBarBackgroundColor(...) | 设置NavigationBar的背景颜色 |
setTitleColor(...) | 设置NavigationBar的标题颜色 |
setTitleSize(...) | 设置NavigationBar的标题大小 |
setShadowImage(...) | 设置NavigationBar的阴影图片 |
setShadowHidden(...) | 设置NavigationBar的阴影是否隐藏 |
setShadow(...) | 设置NavigationBar的阴影 |
setTitleTextAttributes(...) | 设置NavigationBar的标题的Attributes |
setTranslucent(...) | 设置NavigationBar是否透明 |
setBarStyle(...) | 设置NavigationBar是样式 |
setBackgroundImage(...) | 设置NavigationBar背景图片,如果设置图片会覆盖背景颜色 |
setTitle(...) | 设置NavigationBar标题 |
setBackBarButtonItem(...) | 设置NavigationBar返回Item |
setBackBarButtonItem(...) | 设置NavigationBar返回Item |
setLeftButtonItem(...) | 设置NavigationBar左边菜单Item |
setLeftButtonItems(...) | 设置NavigationBar左边菜单Item |
setRightButtonItem(...) | 设置NavigationBar右边菜单Item |
setRightButtonItems(...) | 设置NavigationBar左边菜单Item数组 |
2.YYNavigationBar全局设置Configuration
属性 | 作用 |
---|---|
isHidden | 隐藏NavigationBar |
alpha | NavigationBar的透明度 |
tintColor | NavigationBar的标题颜色 |
shadowImage | 设置NavigationBar的阴影图片 |
isShadowHidden | 隐藏NavigationBar的阴影 |
titleTextAttributes | NavigationBar的Attributes |
isTranslucent | 设置NavigationBar透明 |
setBackgroundImage | 设置NavigationBar的背景图片 |
3.链式使用
NavigationUtils
.with(controller: self)
.setBarBackgroundColor(barTintColor: UIColor.red)
.setTitle(title: InternationalUtils.getInstance.getString("nav_use"))
.setBackBarButtonItem(style: .image(UIImage(named: "back_btn")),tintColor: UIColor.gray)
.build(
五、YYAutoLayout:自动布局
链式使用
centerLabel
.centerX(equalTo: view.yy_centerX)
.centerY(equalTo: view.yy_centerY)
.width(80)
.height(40)
.build()
六、YYTabBar:底部分页导航栏
1.TabBarBasicParamBuilder基本属性
属性 | 作用 |
---|---|
with(...) | TabBarBasicParamBuilder的初始方法,可设置TabBar的图片、标题 |
defultStyle() | 获取默认样式设置,下面属性归属defaultStyle() |
setTextColor(...) | 设置未选择标题的颜色 |
setSelectTextColor(...) | 设置选择标题的颜色 |
setImgColor(...) | 设置未选择图片颜色 |
setSelectImgColor(...) | 设置选择图片颜色 |
bouncesAnimationStyle() | 设置弹簧动画 |
setRemindUseClickIndex(...) | 设置用户提醒点击下标 |
irregularity() | 不规则TabBarItem显示,归属defultStyle(),下面属性归属irregularity() |
setIrregularityIndex(...) | 设置不规则TabBarItem下标 |
setIrregularityBorderColor(...) | 设置不规则图标BorderColor |
setIrregularityBorderWidth(...) | 设置不规则TabBarItem外框宽度 |
setIrregularityBackgroundColor(...) | 设置不规则TabBarItem背景颜色 |
retunDefaultStyle() | 返回defuletStyle |
backgroundColorWithoutTitlesAnimationStyle() | 设置TarBarItem背景颜色不带title,归属defultStyle(),下面属性归属backgroundColorWithoutTitlesAnimationStyle() |
irregularity() | 不规则TabBarItem显示,归属defultStyle(),下面属性归属irregularity() |
setItemBgColor(...) | 设置未选择TabBarItem背景颜色 |
setSelectItemBgColor(...) | 设置选择TabBarItem背景颜色 |
retunDefaultStyle() | 返回defuletStyle |
cumstomStyle() | 获取自定义样式设置,下面属性归属cumstomStyle() |
setCumstonTabBarItemView(...) | 设置自定义TarBarItem数组 |
2.TabBarSetting基本属性
属性 | 作用 |
---|---|
init(...) | 根据TabBarBasicParamBuilder初始化TabBarItem |
setTabBarBackgroundColor(...) | 设置TarBar背景颜色 |
setTabBarBackgroundImage(...) | 设置TarBar背景图片 |
setShouldHijackHandler(...) | 设置TarBarItem点击回调,返回true代表拦截自行处理,false代表不进行拦截处理 |
setDidHijackhHandler(...) | 点击回调处理 |
setDefaultTabIndex(...) | 设置默认选择下标 |
setTabBarBadgeValue(...) | 设置某个TarBarItem的消息气泡内容 |
hideTabBadgeValue(...) | 隐藏某个TarBarItem的消息气泡 |
setTabBarBadgeValueColor(...) | 设置某个TarBarItem的消息气泡颜色 |
3.YYTabBar的使用
-
基本样式使用
let chidVC=[CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController()] let builder:TabBarBasicParamBuilder=TabBarBasicParamBuilder .with(childVCs: chidVC, normalImgs: normalImgs, selectImgs: selectImgs, titles: titles) .defultStyle() .setTextColor(txtColor: UIColor.black) .setSelectTextColor(selectTxtColor: UIColor.red) .setImgColor(imageColor: UIColor.black) .setSelectImgColor(selectImageColor: UIColor.red) .build() let _:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder)
-
TarBarItem不规则样式使用
let chidVC=[CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController()] let builder:TabBarBasicParamBuilder=TabBarBasicParamBuilder .with(childVCs: chidVC, normalImgs: normalImgs, selectImgs: selectImgs, titles: titles) .defultStyle() .irregularity() .setIrregularityIndex(irregularIndex: 2) .setIrregularityBorderColor(borderColor: UIColor.white) .setIrregularityBackgroundColor(backgroundColor: UIColor.systemGreen) .retunDefaultStyle() .setSelectTextColor(selectTxtColor: UIColor.red) .setSelectImgColor(selectImageColor: UIColor.red) .build() let tab:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder) tab.setTabBarBackgroundImage(backgroundImage: UIImage(named: "background_dark")) tab.setShouldHijackHandler(shouldHijackHandler:{ tabBarController,viewController,index in if(index==2){ return true }else{ return false } }) tab.setDidHijackhHandler(didHijackHandler: { tabBarController,viewController,index in })
-
设置背景颜色显示(不带title)
let chidVC=[CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController(),CommonWithoutNavController()] let builder:TabBarBasicParamBuilder=TabBarBasicParamBuilder .with(childVCs: chidVC, normalImgs: normalImgs, selectImgs: selectImgs, titles: titles) .defultStyle() .backgroundColorWithoutTitlesAnimationStyle()//设置背景颜色显示(不带title) .setSwithcBouncesAnimation(switchBgAnimation: true)//开启弹簧动画 .setSpecialIndexAndColor(bgColorIndex: 2)//设置背景颜色突出显示 .retunDefaultStyle() .setRemindUseClickIndex(remindUseClickIndex: 2)//设置暗示用户点击 .build() let _:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder)
-
YYTabBar和YYNavigationBar结合使用
两者结合使用需要注意的是如果内容ControllerView按照原来的高度设置底部会被TabBar遮挡,为了解决这个问题需要设置两步
- 第一步
在创建内容ControllerView之前需要计算出内容View的高度(UIViewController.autoHeight=UIScreen.main.bounds.height - self.tabBar.frame.height)
let chidVC: [UIViewController] = titles.map { _ in
UIViewController.autoHeight=UIScreen.main.bounds.height - self.tabBar.frame.height
let vc: CommonWithNavController = CommonWithNavController()
return vc
}
let builder:TabBarBasicParamBuilder=TabBarBasicParamBuilder
.with(childVCs: chidVC, normalImgs: normalImgs, selectImgs: selectImgs, titles: titles)
.defultStyle()
.build()
let _:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder)
- 第二步
内容ControllerView需要实现AutoHeightUIViewController
-
YYTabBar默认消息气泡使用
let tabBar:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder) tabBar.setTabBarBadgeValue(index: 0, badgeValue: "99+") tabBar.setTabBarBadgeValue(index: 1, badgeValue: " ") tabBar.setTabBarBadgeValue(index: 2, badgeValue: "") tabBar.setTabBarBadgeValue(index: 3, badgeValue: "New") tabBar.setTabBarBadgeValue(index:4, badgeValue: "1") tabBar.setTabBarBadgeValueColor(index: 4, color: UIColor.blue) tabBar.setShouldHijackHandler(shouldHijackHandler: { tabBarController,viewController,index in if(index==2){ tabBar.hideTabBadgeValue(index: 2) }else if(index==4){ tabBar.setTabBarBadgeValueColor(index: 4, color: UIColor.red) } return false })
-
YYTabBar自定义TabBarItemView
1.YYTabBarItemContentView的介绍
属性 | 作用 |
---|---|
insets | 设置contentView的偏移 |
selected | 是否被选中 |
insets | 设置contentView的偏移 |
highlighted | 是否处于高亮状态 |
highlightEnabled | 是否支持高亮 |
textColor | 文字颜色 |
highlightTextColor | 高亮时文字颜色 |
iconColor | icon颜色 |
backdropColor | 背景颜色 |
highlightBackdropColor | 高亮时背景颜色 |
title | 标题 |
badgeValue | 消息气泡内容 |
badgeColor | 消息气泡颜色 |
badgeView | 获取消息气泡View |
selectAnimation(animated: Bool, completion: (() -> ())?) | 设置选择时动画 |
reselectAnimation(animated: Bool, completion: (() -> ())?) | 设置释放时动画 |
highlightAnimation(animated: Bool, completion: (() -> ())?) | 设置高亮时动画 |
dehighlightAnimation(animated: Bool, completion: (() -> ())?) | 设置释放高亮时动画 |
badgeChangedAnimation(animated: Bool, completion: (() -> ())?) | 设置消息动画改变时动画 |
2.实现YYTabBarItemContentView,自定义相关参数
3.设置自定义TabBarItemView
let cumstonItemView=[CumstonSettingItemView(),CumstonAnimateWithTipsContentView(),CumstonAnimateWithNumContentView(),CumstonAnimateWithImgContentView(),cumstonRemindItemView]
let builder:TabBarBasicParamBuilder=TabBarBasicParamBuilder
.with(childVCs: chidVC, normalImgs: normalImgs, selectImgs: selectImgs, titles: titles)
.cumstomStyle()
.setCumstonTabBarItemView(cumstomItemView: cumstonItemView)
.build()
let tab:TabBarSetting=TabBarSetting(vc:self,tabBarBuilder: builder)
七、YYPageView:图片轮播
- 创建PageView
let pageView:YYPageView={
let pageView:YYPageView=YYPageView.init(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 300))
pageView.register(YYDefaltPageViewCell.self, forCellWithReuseIdentifier: "cell")
pageView.transformer = YYPageViewTransformer(type:.none)
pageView.pageControl.interitemSpacing=10
return pageView
}()
- 实现YYPagerViewDataSource,YYPagerViewDelegate
//设置轮滚图片的数量
func numberOfItems(in pagerView: YYPageView) -> Int {
return imageNames.count
}
//每个轮滚内容的设定
func pagerView(_ pagerView: YYPageView, cellForItemAt index: Int) -> UICollectionViewCell {
let cell = pagerView.dequeueReusableCell(withReuseIdentifier: "cell", at: index) as! YYDefaltPageViewCell
cell.imageView?.image=UIImage(named:imageNames[index] )
cell.imageView?.contentMode = .scaleAspectFill
cell.imageView?.clipsToBounds = true
cell.textLabel?.text = String.init(format: "第%d张图片", index)
return cell
}
- 其它用法参照demo
八、YYPageMenu:滑动菜单
1.YYPageMenu的基本使用(需要特别注意下面注释说明部分)
let menu = YYPageMenu.init(frame:CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 50),vc: self, titles: titles)
//设置menu在NavigationBar下面
PositionSettingUtils.position(aboveView: self.navigation.bar, childView: menu!, style: .adaptive)
//设置内容View在menu下面
PositionSettingUtils.position(aboveView: menu!, childView: menu!.page!.view, style: .fixed)
self.view.addSubview(menu!)
//为了解决遮挡问题,需要在初始化内容View之前计算出高度,并且内容View需要实现AutoHeightUIViewController
let viewControllers: [UIViewController] = self.titles.map { _ in
UIViewController.autoHeight=menu!.page!.view.frame.height
let vc: ChildPageViewController = ChildPageViewController(pageMenuVc: self)
return vc
}
//初始化内容View
menu!.page?.initController(viewControllers: viewControllers)
var style:YYPageMenuStyle=YYPageMenuStyle()
style.indicatorColor = .red
style.indicatorCorner = .corner(value: 3)
style.indicatorStyle = .line(widthType: .sizeToFit(minWidth: 20), position: .bottom((margin: 1, height: 2)))
style.titleFont = UIFont.systemFont(ofSize: 18)
style.selectedTitleColor=UIColor.red
menu!.style=style
menu!.backgroundColor=UIColor.yellow
//menu选择回调
menu!.page!.didFinishPagingCallBack={
currentViewController,currentIndex in
self.menu!.setSelectIndex(index: currentIndex)
}
2.YYPageMenuStyle的基本属性
属性 | 作用 |
---|---|
indicatorColor | 指示器颜色 |
indicatorStyle | 指示器风格,类型为YYPageMenuIndicatorStyle:横线类型,line(widthType: YYPageMenuItemWidthType, position: YYPageMenulinePosition)/覆盖类型,cover(widthType: YYPageMenuItemWidthType) |
indicatorCorner | 指示器圆角 |
labelWidthType | label 宽度类型 固定宽度 或 随文字适应宽度 ,类型主要为YYPageMenuItemWidthType:铺满,fixed(width: CGFloat)/自适应,sizeToFit(minWidth: CGFloat) |
titleFont | 标题字体 |
normalTitleColor | normalTitleColor |
selectedTitleColor | 选中标题颜色 |
iconColor | icon颜色 |
backdropColor | 背景颜色 |
highlightBackdropColor | 高亮时背景颜色 |
title | 标题 |
badgeValue | 消息气泡内容 |
badgeColor | 消息气泡颜色 |
九、YYRefresh:下拉刷新/上拉加载更多
-
使用默认下拉刷新/上拉加载更多样式
let refreshView:YYDefaultRefreshHeaderAnimator=YYDefaultRefreshHeaderAnimator.init(frame: .zero) let footView:YYDefaultRefreshFooterAnimator=YYDefaultRefreshFooterAnimator.init(frame: .zero) self.tableView.yy.addPullToRefreshListener(animator: refreshView, handler: { [weak self] in self?.refresh() },aboveView: navigation.bar,childView: self.tableView) self.tableView.yy.addLoadMoreListener(animator: footView){ [weak self] in self?.loadMore() }
-
默认控件YYDefaultRefreshHeaderAnimator/YDefaultRefreshFooterAnimator修改提示文本
属性 | 作用 |
---|---|
YYDefaultRefreshHeaderAnimator | |
pullToRefreshDescription | 刷新提示文本 |
releaseToRefreshDescription | 释放提示文本 |
loadingDescription | 正在加载提示文本 |
YDefaultRefreshFooterAnimator | |
loadingMoreDescription | 上拉加载提示文本 |
noMoreDataDescription | 没有数据提示文本 |
loadingDescription | 正在加载提示文本 |
- 常用的方法
方法 | 作用 |
---|---|
addPullToRefreshListener(animator: YYRefreshProtocol & YYRefreshAnimatorProtocol, handler: @escaping YYRefreshHandler,aboveView:UIView,childView:UIView) | 添加下拉刷新样式、刷新回调、以及在某个控件下面 |
addLoadMoreListener(animator: YYRefreshProtocol & YYRefreshAnimatorProtocol, handler: @escaping YYRefreshHandler) | 添加上拉加载更多样式、刷新回调 |
removeRefreshHeader() | 移除下拉刷新控件 |
removeRefreshFooter() | 移除上拉刷新控件 |
startPullToRefresh() | 开始下拉刷新 |
autoPullToRefresh() | 自动下拉刷新 |
stopPullToRefresh() | 停止下拉刷新 |
noticeNoMoreData() | 通知已经没数据可加载 |
resetNoMoreData() | 重新设置没有数据 |
stopLoadingMore() | 停止上拉加载刷新 |
- 自定义加载控件
实现UIView,YYRefreshAnimatorProtocol,YYRefreshProtocol即可根据里面提供的参数进行自定义,具体可以参考demo
十、YYImageLoader:网络图片加载
- 常用的方法
方法 | 作用 |
---|---|
loadImage(urlString: String,placeholder: UIImage? = nil,completion: ((_ success: Bool, _ error: Error?) -> Void)? = nil) | 加载网络图片 |
loadImage(url: URL, placeholder: UIImage? = nil,completion: ((_ success: Bool, _ error: Error?) -> Void)? = nil) | 加载网络图片 |
loadImage(request: URLRequest,placeholder: UIImage? = nil,completion: ((_ success: Bool, _ error: Error?) -> Void)? = nil) | 加载网络图片 |
- 全局的方法YYImageCache
方法 | 作用 |
---|---|
diskCacheMaxAge | 设置最大缓存时间 |
timeoutIntervalForRequest | 请求超时 |
requestCachePolicy | 图片加载策略 |
-
基本使用代码
imageView.loadImage(urlString: "https://n.sinaimg.cn/tech/transform/8/w334h474/20200107/57f4-imvsvyz4459804.gif",placeholder: UIImage.init(named: "b"))
十一、YYDialog:通用提示框
- 默认提示框使用
AlertDialog
YYDialog
.createAlertDialog()
.defalutDialog()
.setTitleColor(color: UIColor.red)
.setTitleSize(ofSize: 20)
.setContentColor(color: UIColor.gray)
.setSubmitBtnSize(ofSize: 20)
.setSubmitBtnContentColor(color: UIColor.green)
.setAnimationOption(animationOption: .zoom)
.setSubmitButtonListener(clickSubmitBlock: {
_ in
YYDialog
.createToast()
.show(view: self.view, text: "点击了确定按钮")
})
.setButtonType(btnType: .both)
.show(title: "提示", message: "因为你是这个世界上最干净的,最温暖的,最柔软的,我不能用那些通用的所谓聪明来解释你,来对待你,来敷衍你。")
Toast
YYDialog
.createToast()
.show(view: self.view, text: "因为你是这个世界上最干净的,最温暖的,最柔软的,我不能用那些通用的所谓聪明来解释你,来对待你,来敷衍你。")
LoadingDialog
let dialog = YYDialog
.createLoadingDialog()
.defalutDialog()
dialog
.setMessageSize(fontSize: 16)
.setContentViewCornerRadius(radius: 5)
.setMaskLayer(showMaskLayer: true)
.setAnimationOption(animationOption: .zoom)
.show(message: "请稍后...")
- 自定义提示框
1.实现BaseDialogContentView
属性 | 作用 |
---|---|
_contentWidth | 提示框宽度,BaseDialogContentView已设置默认值 |
_contentHeight | 提示框高度,必设值 |
animationOption | 提示框动画,BaseDialogContentView已设置默认值 |
2.自定义使用方法
let dialog=YYDialog
.createLoadingDialog()
.customDialog(custom: CustomLoadingDialog())
dialog.show()
- 其它属性修改请参照demo
十二、DataManager的使用(Http、UserDefaults、File、SQLite)
DataManager的属性
- DataForHttp(DataManager里的Http模块)
属性 | 作用 |
---|---|
GlobalSetting(Http全局参数设定模块) | |
showHttpRequestLog | Http请求日志输出 |
cacheTimeOutWithClear | 缓存过期时间 |
timeoutIntervalForRequest | 超时时间 |
HttpOfNormal(Http的基本网络请求模块) | |
Request<T:Convertible>.request(...) | Http通用请求方法,直接转化成Bean类,Bean类需要继承Convertible |
Share.cancel(...) | 取消请求 |
Share.removeAllCache(...) | 清除所有缓存 |
Share.removeObjectCache(...) | 根据url和params清除缓存 |
HttpOfUpload(Http的图片上传模块) | |
Upload<T:Convertible>.upload(...) | Http通用上传方法,直接转化成Bean类,Bean类需要继承Convertible |
HttpOfDownload(Http的文件下载模块) | |
Download.download(...) | Http通用下载方法 |
Download.resume(...) | 每次进入下载页面需要进行下载初始化 |
Download.downloadCancel(...) | 取消下载 |
Download.downloadCancelAll() | 取消全部下载 |
Download.downloadPercent(...) | 下载百分比 |
Download.downloadDelete(...) | 删除某个下载 |
Download.downloadStatus(...) | 取消状态 |
Download.downloadFilePath(...) | 下载完成后,文件所在位置 |
- DataForSQLiteDB(DataManager里的SQLite模块)
属性 | 作用 |
---|---|
QueryData<T:Convertible>.queryAllData() | 查询bean类所有的数据,T代表bean类型,需要继承Convertible以及SQLiteModel |
QueryData<T:Convertible>.queryAllDataByAsnyc(...) | 异步查询bean类所有数据,T代表bean类型,需要继承Convertible以及SQLiteModel |
QueryData<T:Convertible>.queryDataByWhere(...) | 根据sql条件查询数据 |
QueryData<T:Convertible>.queryDataWithWhereByAsync(...) | 异步根据sql条件查询数据 |
QueryData<T:Convertible>.queryDataByFirst(...) | 查询第一条数据 |
Share.insertData(...) | 插入数据 |
Share.insertDataList(...) | 插入列表数据 |
Share.insertDataListByAsync(...) | 异步插入列表数据 |
Share.deleteDataByWhere(...) | 根据sql条件删除数据 |
Share.deleteAllData(...) | 删除所有数据 |
Share.deleteAllDataByAsync(...) | 异步删除所有数据 |
Share.updateData(...) | 更新数据 |
Share.updateDataList(...) | 更新数据列表 |
Share.updateDataListByAsync(...) | 异步更新数据列表 |
Share.drop(...) | 删除表 |
- DataForFile(DataManager里的File模块)
属性 | 作用 |
---|---|
saveObjectForFile(...) | 保存字段内容,其中参数appendFolderPathAndFileName代表文件路径,这里只需设定补充路径(/test/test.txt) |
queryObjectForFile(...) | 根据路径获取内容 |
- DataForUserDefaults(DataManager里的UserDefaults模块)
属性 | 作用 |
---|---|
saveObjectForKey(...) | 保存内容 |
queryObjectForKey(...) | 根据Key获取内容 |
1.Http
-
基本网络请求
let urlStr = "https://api.apiopen.top/getJoke?page="+String(format: "%1d", pageNow)+"&count=20&type=video" let httpParams:HttpRequestParams=HttpRequestParams() httpParams .setRequestType(requestType: .reqStringUrl) .setReqUrl(requestUrl: urlStr) .setReponseType(responseType: .netWork) .setHttpTypeAndReqParamType(httpTypeAndReqParamType: .get) .build() DataManager.DataForHttp.HttpOfNormal.Request<Result<Array<ContentInfo>>>.request(httpRequestParams: httpParams, requestSuccessResult: { value in }, requestFailureResult: { error in })
注意:在请求时候需要传入一个泛型类作为json数据的转换数据结构,bean类需要实现Convertible才能转化
- HttpRequestParams
属性 | 作用 |
---|---|
setReponseType(responseType:ReponseType) | 设置响应方式,cache:返回缓存数据,netWork:返回网络数据,noCacheRetrunNetWork:缓存优先 |
setHttpTypeAndReqParamType(参数) | 设置请求方法以及请求参数类型,post_json:method为post,请求参数为json格式,pos_param:method为post,请求参数为键值对,get:method为get |
setReqUrl(requestUrl:String) | 设置请求Url |
setUrlRequest(urlRequest: URLRequestConvertible) | 设置请求URLRequest |
setRequestType(requestType:RequestType) | 设置请求的类型 |
setParams(params: Parameters) | 设置请求参数集合 |
setParam(key:String,param:Any) | 设置请求参数 |
setHttpHeaders(headers: HTTPHeaders) | 设置请求头列表 |
setHttpHeader(key:String,header:String) | 设置请求头 |
- 文件下载
1. 每次进入下载页面需要进行下载初始化
DataManager.DataForHttp.HttpOfDownload.Download.resume(url: item.downloadUrl, downloadResume: {
//
})
2. 文件下载
let downloadParams:HttpDownloadRequestParams=HttpDownloadRequestParams()
downloadParams
.setFileName(fileName: "\(item.indexPath.row)---.pdf")
.setReqUrl(requestUrl: url!)
.build()
DataManager.DataForHttp.HttpOfDownload.Download.download(httpDownloadRequestParams: downloadParams, requestSuccessResult: {
respone in
},requestFailureResult: {
error in
},downloadProgress: {
progress in
})
- HttpDownloadRequestParams
属性 | 作用 |
---|---|
setFileName(fileName:String) | 设置下载文件名 |
setHttpTypeAndReqParamType(参数) | 设置请求方法以及请求参数类型,post_json:method为post,请求参数为json格式,pos_param:method为post,请求参数为键值对,get:method为get |
setReqUrl(requestUrl:String) | 设置请求Url |
setParams(params: Parameters) | 设置请求参数列表 |
setParam(key:String,param:Any) | 设置请求参数 |
setHttpHeaders(headers: HTTPHeaders) | 设置请求头列表 |
setHttpHeader(key:String,header:String) | 设置请求头 |
- 图片上传
let url="xxxxx"
let httpParams=HttpUploadRequestParams()
httpParams
.setParam(key: "type", param: "addroadblock")//设置请求参数也可通过setParams()设置Array
.setReqUrl(requestUrl: url) //设置请求链接
.setFileSuffixName(fileSuffixName: ".jpg") //设置文件后缀名,后续上传其它文件扩展也可使用
.setImages(images: [UIImage(named: "d")!,UIImage(named: "e")!])//设置上传图片列表
.setMultiparName(multipartName: "imgList") //设置对应后台服务器上传文件字段
.build()
/**
通过泛型设置结果转换的been类,可返回上传进度
*/
DataManager.DataForHttp.HttpOfUpload.Upload.upload(httpRequestParams: httpParams, requestSuccessResult: {
result in
}, requestFailureResult: {
error in
}, requestProgress: {
progress in
})
- HttpUploadRequestParams
属性 | 作用 |
---|---|
setMultiparName(multipartName:String) | 后天接口提供的字段名 |
setImages(images: [UIImage]?) | 设置上传图片 |
setFileSuffixName(fileSuffixName:String) | 设置上传图片后缀名 |
setReqUrl(requestUrl:String) | 设置请求url |
setParams(params: Parameters) | 设置请求参数 |
setParam(key:String,param:Any)- | 设置请求参数 |
setHttpHeaders(headers: HTTPHeaders)- | 设置请求头 |
setHttpHeader(key:String,header:String) | 设置请求头 |
2.SQLite(数据量比较大的时候花费的时间比较长)
- 初始化数据库和数据库迁移
SQLiteVersionMigrate.setDbVersion(dbName:"collectionDB",dbVersion: 0,migrate: {
oldVersion,newVersion in
for i in oldVersion...newVersion{
if(i == 1){
SQLiteVersionMigrate
.with(cls: SqliteData.self)
.addAttribute(attribute: "a1", dataType: String.self)
.addAttribute(attribute: "a2", dataType: String.self)
.build()
}
}
})
注意:
1.设置数据库名称
2.通过SQLiteVersionMigrate可以进行版本迁移
3.SQLiteVersionMigrate
属性 | 作用 |
---|---|
setDbVersion(...) | 设置数据名、版本号、版本变化回调 |
with(...) | 设置需要变化bean类 |
addAttribute(...) | 表需要增加的字段 |
- 保存的bean类
@objcMembers
class SqliteData: SQLiteModel,Convertible{
var des:String=""
var id:Int=0
override func primaryKey() -> String {
return "id"
}
}
注意:bean需要:
1.使用@objcMembers
2.实现SQLiteModel
3.实现Convertible(Json转化成bean需要)
4.实现primaryKey()方法,必须指定主键
- 实例初始化
let commonSqliteData=SqliteData()
commonSqliteData?.id=0
commonSqliteData?.des="SQLite测试使用"
- 插入数据
DataManager.DataForSQLiteDB.Share.insertData(object: commonSqliteData!)
- 删除所有数据
DataManager.DataForSQLiteDB.Share.deleteAllData(cls: SqliteData.self)
- 异步插入数据
DataManager.DataForSQLiteDB.Share.insertDataListByAsync(cls: SqliteData.self, objectList: list, insertCompleteBlock: {
})
- 更新数据
DataManager.DataForSQLiteDB.Share.updateData(object: commonSqliteData!)
- 查询数据
let result=DataManager.DataForSQLiteDB.QueryData<SqliteData>.queryAllData()
DataManager.DataForSQLiteDB.Share.updateData(object: commonSqliteData!)
- 其它可以查看DataManager
3.File
- 查询数据
let result=DataManager.DataForFile<String>.queryObjectForFile(appendFolderPathAndFileName:"test/test.txt")
- 保存数据
//保存String类型
DataManager.DataForFile<String>.saveObjectForFile(appendFolderPathAndFileName:"test/test.txt" , object: "123")
//保存类型
DataManager.DataForFile<UserDeBean>.saveObjectForFile(appendFolderPathAndFileName: appendBeanPath, object: userDefault)
3.UserDefaults
- 保存数据
DataManager.DataForUserDefaults<String>.saveObjectForKey(key: "key1", object:"1234")
- 查询数据
let result=DataManager.DataForUserDefaults<UserDeBean>.queryObjectForKey(key: "key2")
十三、YYDataShowView:数据加载显示页面
- YYDataShowView基本用法
属性 | 作用 |
---|---|
init(defaultDataShowViewParams:DefaultDataShowViewParams,...) | 默认初始化方法 |
init(custom:BaseDataShowContentView,visibileHeight:CGFloat?=UIScreen.main.bounds.height,aboveView:UIView?=nil)) | 自定义展示内容初始化方法 |
show(parentView:UIViewController) | 显示DataShowView |
hide() | 隐藏DataShowView |
- DefaultDataShowViewParams基本用法
属性 | 作用 |
---|---|
setDefaultDataShowViewType(...) | 设置显示样式:noData、noNetWork、loading |
setDefaultNoDataShowImg(...) | 设置没有数据时显示的图片 |
setDefaultNoNetworkShowImg(...) | 设置没有网络是显示的图片 |
setDefaultShowImgWidth(...) | 设置显示图片的宽度 |
setDefaultShowImgHeight(...) | 设置显示图片的高度 |
setDefaultShowNoDataText(...) | 设置没有数据时显示的文本 |
setDefaultShowNoNetWorkText(...) | 设置没有网络时显示的文本 |
setDefaultShowTextSize(...) | 设置显示文本的字体大小 |
setDefaultShowTextColor(...) | 设置显示文本的颜色 |
setDefaultShowButtonText(...) | 设置按钮的文本 |
setDefaultShowButtonTextSize(...) | 设置按钮的字体大小 |
setDefaultShowButtonTextColor(...) | 设置按钮的文本颜色 |
setDefaultShowButtonBorderWidth(...) | 设置按钮的外边框宽度 |
setDefaultShowButtonBorderColor(...) | 设置按钮外边框颜色 |
setDefaultSHowButtonPadding(...) | 设置按钮的内边距 |
setDefaultShowButtonCornerRadius(...) | 设置按钮的圆角 |
setHiddenShowButton(i...) | 设置按钮是否显示 |
setDefaultShowButtonBackgroundColor(...) | 设置按钮背景颜色 |
setDefaultShowLoadingText(...) | 设置加载文本 |
setDefaulutShowLoadingImgsTimeInterval(...) | 设置加载Image的间隔时间 |
- 没有数据样式
let defaultDataShowViewParams=DefaultDataShowViewParams()
defaultDataShowViewParams
.setDefaultNoDataShowImg(defaultNoDataShowImg: "nodata")
.build()
dataShowView=YYDataShowView(defaultDataShowViewParams:defaultDataShowViewParams,aboveView: navigation.bar,reloadHandler: {
YYDialog.createToast().show(view: self.view, text: "点击重新加载按钮")
})
dataShowView!.show(parentView: self)
- 没有网络样式
let defaultDataShowViewParams=DefaultDataShowViewParams()
defaultDataShowViewParams
.setDefaultDataShowViewType(showViewType: .noNetWork)
.setDefaultNoNetworkShowImg(defaultNoNetworkShowImg: "nonetwork")
.build()
dataShowView=YYDataShowView(defaultDataShowViewParams: defaultDataShowViewParams,aboveView: navigation.bar,reloadHandler: {
YYDialog.createToast().show(view: self.view, text: "点击重新加载按钮")
})
dataShowView!.show(parentView: self)
- 加载数据样式
let imgs=["default_data_show_loading1","default_data_show_loading2","default_data_show_loading3","default_data_show_loading4","default_data_show_loading5","default_data_show_loading6","default_data_show_loading7","default_data_show_loading8","default_data_show_loading10","default_data_show_loading11","default_data_show_loading12"]
let defaultDataShowViewParams=DefaultDataShowViewParams()
defaultDataShowViewParams
.setDefaultDataShowViewType(showViewType: .loading)
.setDefaultLoadingImags(defaultLoadingImags: imgs)
.build()
dataShowView=YYDataShowView(defaultDataShowViewParams: defaultDataShowViewParams,aboveView: navigation.bar)
dataShowView!.show(parentView: self)
- 自定义样式
1.实现BaseDataShowContentView,然后指定_contentHeight(高度)
2.加载自定义View
let customView=CustomDataShowView()
YYDataShowView.init(custom: customView,aboveView: navigation.bar).show(parentView: self)
十四、YYTagView
- 基本用法
属性 | 作用 |
---|---|
YYTagViewBuilder | |
setTagTextColor(...) | 设置Tag的字体颜色 |
setTagSelectedTextColor(...) | 设置Tag点击的字体颜色 |
setTagLineBreakMode(...) | 设置Tag的LineBreakMode |
setTagBackgroundColor(...) | 设置Tag的背景颜色 |
setTagSelectBackgroundColor(...) | 设置Tag的选择时的背景颜色 |
setTagCornerRadius(...) | 设置Tag圆角 |
setTagBorderWidth(...) | 设置Tag外框宽度 |
setTagBorderColor(...) | 设置Tag的外框颜色 |
setTagSelectedBorderColor(...) | 设置Tag外框选择时颜色 |
setTagHorizontalPadding(...) | 设置Tag的左右内边距 |
setTagVerticalPadding(...) | 设置Tag的上下内边距 |
setTagHorizontalMargin(...) | 设置Tag的左右外边距 |
setTagVerticalMargin(...) | 设置Tag的上下外边距 |
setTagAlignment(...) | 设置TagView的位置 |
setTagShadowColor(...) | 设置Tag的阴影颜色 |
setTagShadowRadius(...) | 设置Tag的阴影圆角 |
setTagTextFont(...) | 设置Tag的字体 |
setTagItem(...) | 增加TagItem |
setTagItems(...) | 设置TagItem列表 |
setTagVerticalMargin(...) | 设置Tag的上下外边距 |
buildTagView(...) | 返回TagView |
TagView | |
removeTag(...) | 移除TagItem |
removeAllTags() | 移除TagItems |
setTagClick(...) | 设置TagItem点击事件 |
-
基本使用代码
let tags=["测试使用内容","YYTagView","33","西亚","123456","ijklmn","45677","This should be the third tag","人间烟火"] let tagView=YYTagViewBuilder .with() .setTagItems(tags) .setTagTextFont(textFont: UIFont.systemFont(ofSize: 20)) .setTagTextColor(color: UIColor.white) .setTagAlignment(alignment: .center) .setTagBackgroundColor(color: UIColor.systemBlue) .setTagSelectedTextColor(color: UIColor.red) .setTagSelectedBorderColor(color: UIColor.gray) .setTagCornerRadius(cornerRadius: 5) .setTagVerticalPadding(padding: 10) .setTagHorizontalPadding(padding: 10) .setTagVerticalMargin(margin: 10) .setTagHorizontalMargin(margin: 10) .buildTagView() tagView.setTagClick(tagClick: { title,tagView,sender in print(title) })
十五、MVP
步骤:
- 1.创建一个Presenter,实现BasePresenter
- 2.创建一个与View关联的协议
- 3.实现IBaseControllerView<T:BasePresenter>和2创建的协议
- 4.通过mPresenter调用Presenter里的方法
- 5.在Presenter里通过mView调用View的方法
代码
-
协议以及Presenter
protocol MvpView { func refreshUI(value:Result<Array<ContentInfo>>) } class MvpPresenter:BasePresenter{ func requestData() { let urlStr = "https://api.apiopen.top/getJoke?page=1&count=20&type=video" let httpParams:HttpRequestParams=HttpRequestParams() httpParams .setRequestType(requestType: .reqStringUrl) .setReqUrl(requestUrl: urlStr) .setReponseType(responseType: .netWork) .setHttpTypeAndReqParamType(httpTypeAndReqParamType: .get) .build() DataManager.DataForHttp.HttpOfNormal.Request<Result<Array<ContentInfo>>>.request(httpRequestParams: httpParams, requestSuccessResult: { value in (self.mView as! MVPUseControllerView).refreshUI(value: value) }, requestFailureResult: { error in }) } }
-
View实现
class MVPUseControllerView:IBaseControllerView<MvpPresenter>,MvpView{ var tableView: UITableView! var manager: YYTableViewManager! var tableViewStyle: UITableView.Style = UITableView.Style.plain let section:YYTableViewSection = YYTableViewSection() var dataLoadingView:YYDataShowView? func refreshUI(value:Result<Array<ContentInfo>>) { for content in value.result!{ self.section.add(item: content) } self.manager.reloadData() self.dataLoadingView?.hide() } override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor=UIColor.white self.tableView = UITableView(frame: self.view.bounds, style: self.tableViewStyle) self.view.addSubview(self.tableView); self.manager = YYTableViewManager(tableView: self.tableView) NavigationUtils .with(controller: self) .setBackBarButtonItem(style: .image(UIImage(named: "back_btn")),tintColor: UIColor.gray) .setTitle(title:"MVP") .build() manager.add(section: section) manager.register(ShowCell.self, ContentInfo.self) tableView.separatorStyle = .none let imgs=["default_data_show_loading1","default_data_show_loading2","default_data_show_loading3","default_data_show_loading4","default_data_show_loading5","default_data_show_loading6","default_data_show_loading7","default_data_show_loading8","default_data_show_loading10","default_data_show_loading11","default_data_show_loading12"] let loadingDataShowViewParams=DefaultDataShowViewParams() loadingDataShowViewParams .setDefaultDataShowViewType(showViewType: .loading) .setDefaultLoadingImags(defaultLoadingImags: imgs) .build() dataLoadingView=YYDataShowView(defaultDataShowViewParams:loadingDataShowViewParams,aboveView:navigation.bar) self.dataLoadingView?.show(parentView: self) mPresenter?.requestData() } }
十六、通用工具类
- IPhoneUtils
属性 | 作用 |
---|---|
getNavBarHeight() | 获取NavigationBar高度 |
isIphoneX() | 判断是否是iphoneX以上 |
- ColorUtils
属性 | 作用 |
---|---|
clickSelectBgChange(...) | 设置View点击时的背景变化 |
RGBColor(...) | 获取RGB颜色 |
colorWithHexString() | 16进制颜色转化成UIColor |
- InternationalUtils
属性 | 作用 |
---|---|
getString(...) | 获取本地Localizable对应的内容 |
initUserLanguage() | 初始化语言 |
setLanguage(...) | 设置当前语言 |
getCurrentLanguage() | 获取当前语言 |
- UILabelUtils
属性 | 作用 |
---|---|
getLabHeigh(...) | 获取UILabel高度 |
- PositionSettingUtils
属性 | 作用 |
---|---|
position(...) | 设置View的位置和高度 |
-
Logger(日志输出)
-
UILabelPadding(可设置内边距的UILabel)
属性 | 作用 |
---|---|
init(...) | 初始化UILabel,设置内边距 |
网友评论