CollectioniOS聚合了项目搭建的一些基本模块,节约开发者时间,协助项目的快速搭建,可以知足一个项目的基本实现。git
github地址:github.com/usernameyan…
简书地址:www.jianshu.com/p/a445521e7…
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:数据加载显示样式(没有数据、网络错误、正在加载)github
1.应用基本配置json
2.UTTableView的封装使用api
3.UICollectionView/UIScrollView的基础使用数组
4.YYNavigationBar:顶部导航栏缓存
5.YYAutoLayout:自动布局服务器
6.YYTabBar:底部分页导航栏网络
7.YYPageView:图片轮播数据结构
8.YYPageMenu:滑动菜单app
9.YYRefresh:下拉刷新/上拉加载更多
10.YYImageLoader:网络图片加载
11.YYDialog:通用提示框
12.YYHttpUtils:网络请求
13.YYDataShowView:数据加载显示页面
14.通用工具类
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()获取当前语言
复制代码
(1)建立Strings File文件,并命名为InfoPlist.strings
(2)选中建立好的文件,点击右侧Localize,勾选所需语言
(3)配置InfoPlist.strings:CFBundleDisplayName =
复制代码
若是没有什么特别需求的能够直接实现YYIBaseTableViewController,里面已经把基本的封装完成:
class AutoCalHeightController:YYIBaseTableViewController{
var arrayM:NSMutableArray?
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor=UIColor.white
tableView.separatorStyle = .none
// Add main section
let section = YYTableViewSection()
manager.add(section: section)
manager.register(CommonTableViewCell.self, CommonTableItem.self)
//数据组装
self.arrayM=NSMutableArray()
self.arrayM!.add("qqqq")
for str in arrayM!{
let item = CommonTableItem()
item.desc=str as? String
section.add(item: item)
}
}
}
复制代码
若是不实现YYIBaseTableViewController,可经过:
//把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数据 |
属性 | 做用 |
---|---|
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组下的数据 |
属性 | 做用 |
---|---|
item | 在register时和Cell绑定的YYTableItem,主要是数据的传递 |
cellWillAppear() | Cell显示的时候会调用这个回调 |
cellDidDisappear() | Cell消失时会调用这个回调 |
setSelected() | Cell设置选择状态 |
属性 | 做用 |
---|---|
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代码实现
属性 | 做用 |
---|---|
init(lineSpacing: CGFloat, columnSpacing: CGFloat, sectionInsets: UIEdgeInsets) | 布局初始化,可设置行间距、列间距、外框边距 |
属性 | 做用 |
---|---|
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
}
}
复制代码
请参照上面UITableView的用法
属性 | 做用 |
---|---|
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数组 |
属性 | 做用 |
---|---|
isHidden | 隐藏NavigationBar |
alpha | NavigationBar的透明度 |
tintColor | NavigationBar的标题颜色 |
shadowImage | 设置NavigationBar的阴影图片 |
isShadowHidden | 隐藏NavigationBar的阴影 |
titleTextAttributes | NavigationBar的Attributes |
isTranslucent | 设置NavigationBar透明 |
setBackgroundImage | 设置NavigationBar的背景图片 |
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(
复制代码
centerLabel
.centerX(equalTo: view.yy_centerX)
.centerY(equalTo: view.yy_centerY)
.width(80)
.height(40)
.build()
复制代码
属性 | 做用 |
---|---|
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数组 |
属性 | 做用 |
---|---|
init(...) | 根据TabBarBasicParamBuilder初始化TabBarItem |
setTabBarBackgroundColor(...) | 设置TarBar背景颜色 |
setTabBarBackgroundImage(...) | 设置TarBar背景图片 |
setShouldHijackHandler(...) | 设置TarBarItem点击回调,返回true表明拦截自行处理,false表明不进行拦截处理 |
setDidHijackhHandler(...) | 点击回调处理 |
setDefaultTabIndex(...) | 设置默认选择下标 |
setTabBarBadgeValue(...) | 设置某个TarBarItem的消息气泡内容 |
hideTabBadgeValue(...) | 隐藏某个TarBarItem的消息气泡 |
setTabBarBadgeValueColor(...) | 设置某个TarBarItem的消息气泡颜色 |
基本样式使用
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以前须要计算出内容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
属性 | 做用 |
---|---|
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: (() -> ())?) | 设置消息动画改变时动画 |
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)
复制代码
建立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
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)
}
复制代码
属性 | 做用 |
---|---|
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 | 消息气泡颜色 |
使用默认下拉刷新/上拉加载更多样式
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() | 中止上拉加载刷新 |
方法 | 做用 |
---|---|
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) | 加载网络图片 |
方法 | 做用 |
---|---|
diskCacheMaxAge | 设置最大缓存时间 |
timeoutIntervalForRequest | 请求超时 |
requestCachePolicy | 图片加载策略 |
基本使用代码
imageView.loadImage(urlString: "https://n.sinaimg.cn/tech/transform/8/w334h474/20200107/57f4-imvsvyz4459804.gif",placeholder: UIImage.init(named: "b"))
复制代码
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: "请稍后...")
复制代码
属性 | 做用 |
---|---|
_contentWidth | 提示框宽度,BaseDialogContentView已设置默认值 |
_contentHeight | 提示框高度,必设值 |
animationOption | 提示框动画,BaseDialogContentView已设置默认值 |
let dialog=YYDialog
.createLoadingDialog()
.customDialog(custom: CustomLoadingDialog())
dialog.show()
复制代码
基本网络请求
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()
YYHttpRequestUtils<Result<Array<ContentInfo>>>.request(httpRequestParams: httpParams, requestSuccessResult: {
value in
//数据完成以后须要从新刷新数据
//self.manager.reloadData()
}, requestFailureResult: {
error in
})
复制代码
属性 | 做用 |
---|---|
request(参数) | 网络请求方法 |
cancel(httpRequestParams:HttpRequestParams) | 取消请求 |
removeAllCache(completion: @escaping (Bool)->()) | 清除全部缓存 |
removeObjectCache(httpRequestParams:HttpRequestParams, completion: @escaping (Bool)->()) | 根据url和params清除缓存 |
removeObjectCache(httpRequestParams:HttpRequestParams, completion: |
属性 | 做用 |
---|---|
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) | 设置请求头 |
YYHttpDowloadUtils.resume(url: item.downloadUrl, downloadResume: {
})
复制代码
let downloadParams:HttpDownloadRequestParams=HttpDownloadRequestParams()
downloadParams
.setFileName(fileName: "\(item.indexPath.row)---.pdf")
.setReqUrl(requestUrl: url!)
.build()
YYHttpDowloadUtils.download(httpDownloadRequestParams: downloadParams, requestSuccessResult: {
respone in
},requestFailureResult: {
error in
},downloadProgress: {
progress in
})
复制代码
属性 | 做用 |
---|---|
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类,可返回上传进度
*/
YYHttpUploadUtils<UserInfo>.upload(httpRequestParams: httpParams, requestSuccessResult: {
result in
}, requestFailureResult: {
error in
print(error)
}, requestProgress: {
progress in
})
复制代码
属性 | 做用 |
---|---|
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) | 设置请求头 |
属性 | 做用 |
---|---|
showHttpRequestLog | 设置是否开启请求日志输出 |
cacheTimeOutWithClear(expiry: YYHttpExpiry) | 缓存过时时间 |
timeoutIntervalForRequest(_ timeInterval :TimeInterval) | 请求超时 |
属性 | 做用 |
---|---|
init(defaultDataShowViewParams:DefaultDataShowViewParams,...) | 默认初始化方法 |
init(custom:BaseDataShowContentView,visibileHeight:CGFloat?=UIScreen.main.bounds.height,aboveView:UIView?=nil)) | 自定义展现内容初始化方法 |
show(parentView:UIViewController) | 显示DataShowView |
hide() | 隐藏DataShowView |
属性 | 做用 |
---|---|
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)
自定义样式
let customView=CustomDataShowView()
YYDataShowView.init(custom: customView,aboveView: navigation.bar).show(parentView: self)
复制代码
属性 | 做用 |
---|---|
getNavBarHeight() | 获取NavigationBar高度 |
isIphoneX() | 判断是不是iphoneX以上 |
属性 | 做用 |
---|---|
clickSelectBgChange(...) | 设置View点击时的背景变化 |
RGBColor(...) | 获取RGB颜色 |
colorWithHexString() | 16进制颜色转化成UIColor |
属性 | 做用 |
---|---|
getString(...) | 获取本地Localizable对应的内容 |
initUserLanguage() | 初始化语言 |
setLanguage(...) | 设置当前语言 |
getCurrentLanguage() | 获取当前语言 |
属性 | 做用 |
---|---|
getLabHeigh(...) | 获取UILabel高度 |
属性 | 做用 |
---|---|
position(...) | 设置View的位置和高度 |
Logger(日志输出)
UILabelPadding(可设置内边距的UILabel)
属性 | 做用 |
---|---|
init(...) | 初始化UILabel,设置内边距 |