MBTraitCollection
UIViewController 分类,通过暴露新属性 mbTraitCollection
在 UIViewController 上,提供对 UITraitCollection 对象的安全 iOS7 兼容访问。
如何使用 MBTraitCollection
将此行添加到您的项目 Podfile
中
pod 'MBTraitCollection', '~> 0.1.0'
然后,在视图控制器中包含它,并在 >iOS 7 目标上使用它
#import <MBTraitCollection/UIViewController+MBTraitCollection.h>
@implementation MyViewController
-(void)myMethod
{
if (self.mbTraitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
// ...
}
}
@end
tl;dr: 背景
什么是特质集合
从Apple 文档中获取:UITraitCollection 对象提供了对 UIViewController 对象特性的详细信息,该对象管理组成您应用程序界面一部分的一组视图。这些特性或特征定义了视图控制器的大小类、显示比例和设备方言。当创建视图控制器时,会为该视图控制器自动创建一个特性集合。
特性集合有什么好处
特性集合非常出色,因为它可以轻松地访问设备特性,而不需要了解确切的设备品牌或型号。特性集合可以用作一种干净的方式来程序化地根据不同类型的设备区分您的应用程序行为,而不需要硬编码设备类型或大小。所以,而不是像这样
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
// iphone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone()) {
// iphone 6 landscape
if ([[UIScreen mainScreen] nativeBounds].size.height/[[UIScreen mainScreen] nativeScale]) == 736.0f
&& UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) {
return CGSizeMake(100, 100);
}
// all other iphones
return CGSizeMake(50, 50);
}
// ipads
else {
return CGSizeMake(100, 100);
}
}
您可以获得一个更干净和更具有前瞻性的解决方案
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout *)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
if (self.mbTraitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact) {
return CGSizeMake(50, 50);
}
else {
return CGSizeMake(100, 100);
}
}
通常,特性将为您提供对以下4个非常实用的属性的访问权限
userInterfaceIdiom
horizontalSizeClass
verticalSizeClass
displayScale
问题
特性集合是在iOS 8中引入的,即使可以在最新SDK中对旧于8.0的部署目标进行编译,其使用也将在iOS 7应用程序中导致崩溃。这使它们在应用部署目标被限制到8.0之前无用。
解决方案:MBTraitCollection
为了解决这个问题,我创建了 UIViewController 的一个分类,它公开了一个新的属性 mbTraitCollection
。访问此属性时,将会为您懒加载数据回退兼容的 MBTraitCollection 类。该类基本上是围绕 UITraitCollection 的包装,并在可能的情况下使用原生行为(即,在 iOS >= 8)。在较老的 iOS 版本中,此类将使用其他可用的技术为您确定设备特性,从而允许您在 iOS 7 上使用特性集合。