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,設置內邊距 |