UIAlertController
的模态弹窗控件,使用方式与 UIAlertController
相近,但相比 UIAlertController
支持了更多的功能,包括:
PHAsset
,用于表示相簿里的一个资源,但相比 PHAsset
使用更加便捷,主要特性包括:
UIImageOrientation
和 data 等信息。PHAssetCollection、PHFetchResult
,用于表示一个相簿或者相簿资源合集,与系统类相比使用更加便捷,主要特性包括:
UIAlertView
。UIBarButtonItem
、UITabBarItem
上显示未读数(badge
)和未读红点(updatesIndicator
),且对设置的时机无要求,不用担心 valueForKey:@"view"
返回 nil
的情况。UIButton
的按钮控件,支持的特性包括:
tintColor
一起变化(系统的 UIButton
默认不支持)。UIButton
只支持图片显示在文字左边)。navigationItem
的 UIBarButtonItem
对象。QMUINavigationButton
实例并将其作为 UIBarButtonItem
的 customView,QMUINavigationButton
内部专门针对每个 iOS 版本都调整了顶部按钮的间距和位置,从而达到即便使用 customView
,布局也依然和系统的 UIBarButtonItem
保持一致的效果。UIToolbar
上的按钮的控件,一般有两种使用方式:
UIBarButtonItem
对象。QMUIToolbarButton
实例并将其作为 UIBarButtonItem
的 customView。UITableView
、UICollectionView
高度计算时缓存高度的类,以业务定义的 key 作为标志来缓存,但由于代码较为陈旧,也不支持 self-sizing cells
,所以后续可能会被 QMUICellHeightKeyCache
和 QMUICellSizeKeyCache
代替(目前依然是主要使用的组件)。UITableView
、UICollectionView
高度计算时缓存高度的类,以 NSIndexPath
作为标志来缓存,基本废弃。UITableView
使用的 cell 高度缓存控件,依赖于 estimatedRowHeight
和 self-sizing cells
,具体的使用方式请参考 UITableView (QMUICellHeightKeyCache)
注释。不过由于目前 iOS 的 estimatedRowHeight
bug 太多,因此这个控件暂时未得到大规模使用,也无法完全代替旧的 QMUICellHeightCache
。QMUICellHeightKeyCache
相同,不过搭配的是 UICollectionView
。目前这个控件尚未完成,只是先占位,请勿使用。UICollectionViewFlowLayout
,用于横向的按页滚动布局,包含 3 种动画效果:
Class
,而只是一个头文件,里面定义了大量的常用的宏及 C 函数,按功能分类大概包括:
DEBUG
模式,当前编译环境使用的 SDK 版本,忽略某些常见的 warning 等。UIViewAnimationOptions
。UIViewController
,建议作为项目里的所有界面的基类来使用。主要特性包括:
QMUINavigationTitleView
,支持loading、副标题、下拉菜单,设置标题依然使用系统的 setTitle:
方法。QMUIEmptyView
,支持显示loading、空文案、操作按钮。navigationItem
、底部 toolbarItem
、响应系统的动态字体大小变化等,从而保证相同类型的代码集中到同一个方法内,避免多人交叉维护时代码分散难以查找。supportedOrientationMask
属性修改界面支持的设备方向,可直接对实例操作,无需重写系统的方法。UITableViewController
,作为项目里的列表界面的基类来使用。主要特性包括:
QMUICommonViewController
,具备父类的 titleView、emptyView 等功能。QMUITableView
,具备比 UITableView
更强大的功能。headerView
。contentInset
,而不使用系统默认的 automaticallyAdjustsScrollViewInsets
特性。UIWindowLevel
的维护、常见的 UIKit 控件的自定义等,都由这个类管理。使用者通过自己业务项目的 QMUIConfigurationTemplate
来为这个单例赋值,而业务代码里则通过 QMUIConfigurationMacros.h
文件里的宏来使用这些值。QMUIConfiguration
赋值,业务项目应该将 QMUI 里的 QMUIConfigurationTemplate
文件复制到业务项目里,修改赋值后调用 setupConfigurationTemplate
方法以生效。QMUIConfiguration
的每个属性定义一个对应的宏,以方便在代码里使用。headerView
、contentView
、footerView
来组织弹窗里的内容。弹窗只能显示取消和确认两个按钮。QMUIDialogViewController
实现的支持列表选择的弹窗,支持单选和多选。QMUIDialogViewController
实现的带输入框的弹窗,支持自动管理提交按钮的 enable 状态。pageControl
和发送按钮。QMUIEmotionView
实现的通用表情面板,需要绑定一个 UITextField
或 UITextView
来使用,会接管输入框的文字删除,自动判断当前是否正在删除某个表情的占位符。float:left / right
的布局,只要通过 addSubview:
将 view 添加进来,即可自动布局。QMUIFloatLayoutView
提供了对 item 的最小宽高、最大宽高以及 item 之间的间距的控制。QMUIGridView
并不支持自动根据空间调整每一行每一列的 item 数量,如有这种需求,建议使用 UICollectionView
,或自行计算新的 item 行列数。NSNotification
对象中快速获取相关的信息。Core Graphic
绘图相关的方法。dimmend
状态。UIView
添加弹簧动画的方式。getter
转换成对应的 setter
。QMUIAsset
对象组成的数组中是否包含特定的 QMUIAsset
对象。QMUIAsset
对象组成的数组中移除特定的 QMUIAsset
对象。QMUIImagePreviewView
的控件,以 UIViewController
的形式存在,因此可以当成一个普通的 controller 以 push 或 present 的方式开始图片预览,若使用 present,则开始/结束动画支持两种:
UILabel
的基础上增加了 3 个特性:
UILabel (QMUI_Marquee)
分类用于支持对 UILabel
开启系统内置的跑马灯效果。UIView
或 UIViewController
以浮层的形式显示出来并自动布局。支持 3 种方式来显示浮层:
UIWindow
盖在当前界面上,将 QMUIModalPresentationViewController
以 rootViewController
的形式显示出来,支持横竖屏自动调整方向和布局,不支持在浮层不消失的情况下做界面切换(因为 window 会把背后的 controller 盖住,看不到界面切换)。presentViewController:animated:completion:
方法来显示,支持界面切换。注意 使用这种方法必定只能以动画的形式来显示浮层,无法以无动画的形式来显示,并且 animated
参数必须为 NO
。superview
上,从而能够实现在浮层不消失的情况下进行界面切换,但需要 superview
自行管理浮层的大小和横竖屏旋转,而且 QMUIModalPresentationViewController
不能用局部变量来保存,会在方法执行完后被释放,所以需要自行 retain。QMUIModalPresentationViewController
还支持几个特性:
layoutBlock
支持自定义的布局,并支持兼容键盘的显隐。showingAnimation
支持自定义显示动画,并支持兼容键盘的显隐。hidingAnimation
支持自定义隐藏动画,并支持兼容键盘的显隐。QMUIModalPresentationViewController
的管理,包括判断当前是否有任一浮层正在显示、隐藏所有正在显示的浮层等。UINavigationController
,建议作为项目里的所有 navigationController 的基类。通常搭配 QMUICommonViewController
来使用,提供的功能包括:
willShow
、didShow
、willPop
、didPop
等时机给 viewController
使用。navigationItem.titleView
的标题控件,提供的功能包括:
accessoryView
)。accessoryView
默认支持下拉箭头的样式,也可自定义。tintColor
修改进度条的颜色。UISearchBar(QMUI)
。UISegmentedControl
,相比 UISegmentedControl
支持了更多的功能,有两种使用方式:
UISegmentedControl
的 UI,可以比较大程度地修改样式。比如 tintColor
,selectedTextColor
等参数。tintColor
来渲染 UISegmentedControl
的 UI,支持非选中/选中状态的背景图,item 之间的分割线,字体颜色等参数。UITabBarController
,优化对横竖屏逻辑,横竖屏的方向由 tabBarController 当前正在显示的 controller 来决定。QMUICommonTableViewController
、QMUITableViewCell
系列的类使用,而其本身只提供了去除列表不满一屏的情况下的尾部空行的功能。QMUITableView
使用,支持调整 textLabel
、detailTextLabel
、imageView
、accessoryView
的间距,支持获取 cell 在当前 section 里的位置(QMUITableViewCellPosition
)。UITableViewHeaderFooterView
,支持显示一行文字和右边的 accessoryView
。UITextField
,相比 UITextField
支持了更多的功能:
placeholderColor
。UITextField
的文字内边距(文字与输入框之间的空白填充)。UITextView
,相比 UITextView
支持了更多的功能:
placeholder
并支持更改 placeholderColor
。textViewShouldReturn:
方法快速监听键盘发送按钮的点击事件,无需自行判断换行符。textContainerInset.bottom
。+[UIColor qmui_colorWithThemeProvider:]
用于创建自动更新的动态颜色。+[UIImage qmui_imageWithThemeProvider:]
用于创建自动更新的动态图片。+[UIVisualEffect qmui_effectWithThemeProvider:]
用于创建自动更新的动态模糊效果。QMUIThemeManager
用于切换主题、获取当前的主题。backgroundView
、contentView
来组织 toast 里的内容,分别用于背景和内容,带有多种接口可以灵活修改样式,具体可参看 QMUIToastBackgroundView.h
与 QMUIToastContentView.h
。也可以由外部提供,更具扩展性。QMUIToastAnimator.h
。也可以通过协议添加自定义动画。QMUIToastView
,支持弹出纯文本、loading、succeed、error、info 等五种 tips。contentMode
来控制图片/视频的显示模式,具体包括 UIViewContentModeCenter
, UIViewContentModeScaleAspectFill
, UIViewContentModeScaleAspectFit
三种模式。block
方式使用 CAAnimationDelegate
,语法更简洁的同时可以避免 CAAnimation.delegate
为 strong
带来的内存管理的麻烦。sublayer
移到所有 sublayer
的最前面或最后面。setBounds:
、setPosition:
存在 NaN
导致的 crash。Character Sequences
时,进行裁剪操作常常会导致 bug,比如一个 emoji 可能占用 1 - 4 长度的字符,如果不慎从中间裁剪掉则会出现乱码)。qmui_queryItems
将一个 url 里的 query 转换成一个 NSDictionary
。CGFloat
或 NSInteger
转换为字符串的快捷方法。UIActivityIndicatorView
的大小(系统的 UIActivityIndicatorView
默认不支持调整为任意大小)。UIBarButtonItem
、UITabBarItem
内部的 view
。qmui_didFinishLaunching
属性用于判断当前 App 是否已完全启动。UIBarButtonItem
、UITabBarItem
内部的 view
。initWithImage:title:
。UIButton
高度一键设置为单行文字时的高度,从而可在“ button 宽度固定、高度自适应”的布局场景中完全省去 sizeToFit
/ sizeThatFits:
的相关代码。NSAttributedString
。collectionView
时。reloadData
的操作。indexPathsForVisibleItems
方法返回的数组成员是无序排列的,不能直接通过 firstObject
拿到第一个 cell )。selectedBackgroundView
。@"#ff0000"
)和 UIColor
对象之间互相转换。@"255,0,0,.3"
)和 UIColor
对象之间互相转换。UIColor
对象当前的 RGBA 通道及 HSB 的值。fontSize
都会被转换为另一个大小的值)。[UIColor colorIsDark]
就能更好地为图片上方的内容选择一个颜色来展示。NSAttributedString
里图文混排时做图片与文字之间的间距)。NSAttributedString
转换成 UIImage
。UIView
截图。UIImageView
的宽高比例调整为和图片的宽高比例一致,同时不超过给定的大小。UILabel
。UILabel
在显示中文字符时的渲染性能。textAttributes
属性设置 label 的文字样式,无需自行构造 NSAttributedString
。qmui_showPrincipalLines
可以显示当前文字的 descender、xHeight、capHeight、lineHeight,便于调试。UINavigationController
在 push/pop 过程中如果前后两个界面的导航栏样式不一致时的样式问题。rootViewController
。UINavigationController
在你使用了自定义的返回按钮或隐藏了导航栏的情况下,会屏蔽手势返回)。contentInset
。UISearchBar
按照 QMUIConfigurationTemplate
的全局样式进行格式化。searchBar
内部的一些私有 view,例如背景容器、输入框、取消按钮、segmentedControl 等。searchBar
绑定的 UISearchController
对象。searchBar
内输入框的布局。searchBar
在脱离 UISearchController
单独使用时可以强制让 cancelButton
一直处于 enabled 状态(系统只有在搜索框键盘聚焦时才会 enabled,失焦时 disabled,但这通常不是我们想要的)。tabBar
内部的 backgroundView
、shadowImageView
、effectView
的引用。tabBar
磨砂的前景色,系统默认是无法做到这一点的,因为 UIVisualEffectView
在某些 blur style 下会有自带的一层前景色,且无法修改,你设置的前景色最终会和系统的前景色叠加,导致总是无法精准实现业务所需效果。UITabBarItem
里的 barButton
和 imageView
,以便做一些自定义的操作,例如添加未读数字等。QMUITableViewStyleInsetGrouped
圆角列表。sectionIndex
索引条的 frame
。sectoinHeaderView
内。QMUITableViewCellPosition
),这样你就可以方便地为“第一行或最后一行的 cell”做特殊处理。QMUITableViewCell
、QMUICellHeightKeyCache
、QMUICellHeightIndexPathCache
实现对 cell 高度的动态计算和缓存。performBatchUpdates:completion:
。tableView
的引用。UITableViewCellStyle
的值。selectedBackgroundView
。transform
和 frame
等。UIView
都支持在上/下/左/右显示边框,边框大小、颜色支持自定义,可以省去专门用一个 view 去实现分隔线的场景。setFrame:
时存在 NaN
的值引发的 crash。block
的形式监听某些常用的时机,例如 frame
、tintColor
的变化,以及 hitTest
、layoutSubviews
、sizeThatFits
的重写等。qmui_fixedSize
把某个 view 设置为固定大小,通常使用的场景是某个网络上加载下来的图片(大小不确定)要放在某个 UIButton
上,并且希望不管什么图都固定显示为某个 size,以前通常只有两种方式来实现:一是将图片裁剪为指定大小,二是重写一个自定义的 UIButton,现在可以简单地设置 UIButton.imageView.qmui_fixedSize
即可。navigationController
堆栈里的上一个 viewController
。navigationController
堆栈里的上一个 viewController
的标题,可用于设置当前界面的返回按钮的文字。viewController
里的最高层可见的 viewController
。qmui_visibleState
获取当前的生命周期阶段,通过 qmui_visibleStateDidChangeBlock
监听生命周期的变化,省去继承重写 viewWillXxx/viewDidXxx 系列方法的麻烦。UIViewController
的某些方法。UINavigationController
、UITabBarController
)