CollectioniOS聚合了项目搭建的一些基本模块,节约开发者时间,协助项目的快速搭建,能够满足一个项目的基本实现。
github地址:github.com/usernameyan…
简书地址:www.jianshu.com/p/a445521e7…
1.解决Toast连续点击时多个Toast同时显示
2.解决库中的默认图片显示不出来问题
1.增加DataManager,对Http数据请求、UserDefaults、File、SQLite的整合使用,移除YYHttpUtils 2.增加YYTagView 3.增加MVP
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:数据加载显示样式(没有数据、网络错误、正在加载)
1.应用基本配置
2.UTTableView的封装使用
3.UICollectionView/UIScrollView的基础使用
4.YYNavigationBar:顶部导航栏
5.YYAutoLayout:自动布局
6.YYTabBar:底部分页导航栏
7.YYPageView:图片轮播
8.YYPageMenu:滑动菜单
9.YYRefresh:下拉刷新/上拉加载更多
10.YYImageLoader:网络图片加载
11.YYDialog:通用提示框
12.DataManager的使用(Http、UserDefaults、File、SQLite)
13.YYDataShowView:数据加载显示页面
14. YYTagView
15. MVP
16.通用工具类
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 = 复制代码
通过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数据 |
属性 | 作用 |
---|---|
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() 复制代码
属性 | 作用 |
---|---|
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(...) | 下载完成后,文件所在位置 |
属性 | 作用 |
---|---|
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(...) | 删除表 |
属性 | 作用 |
---|---|
saveObjectForFile(...) | 保存字段内容,其中参数appendFolderPathAndFileName代表文件路径,这里只需设定补充路径(/test/test.txt) |
queryObjectForFile(...) | 根据路径获取内容 |
属性 | 作用 |
---|---|
saveObjectForKey(...) | 保存内容 |
queryObjectForKey(...) | 根据Key获取内容 |
基本网络请求
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 }) 复制代码
属性 | 作用 |
---|---|
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) | 设置请求头 |
DataManager.DataForHttp.HttpOfDownload.Download.resume(url: item.downloadUrl, downloadResume: { // }) 复制代码
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 }) 复制代码
属性 | 作用 |
---|---|
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) | 设置请求头 |
初始化数据库和数据库迁移
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() } } }) 复制代码
属性 | 作用 |
---|---|
setDbVersion(...) | 设置数据名、版本号、版本变化回调 |
with(...) | 设置需要变化bean类 |
addAttribute(...) | 表需要增加的字段 |
保存的bean类
@objcMembers class SqliteData: SQLiteModel,Convertible{ var des:String="" var id:Int=0 override func primaryKey() -> String { return "id" } } 复制代码
实例初始化
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
查询数据
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) 复制代码
保存数据
DataManager.DataForUserDefaults<String>.saveObjectForKey(key: "key1", object:"1234") 复制代码
查询数据
let result=DataManager.DataForUserDefaults<UserDeBean>.queryObjectForKey(key: "key2") 复制代码
属性 | 作用 |
---|---|
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) 复制代码
属性 | 作用 |
---|---|
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) }) 复制代码
协议以及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() } } 复制代码
属性 | 作用 |
---|---|
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,设置内边距 |