叫兽又回来了,之前我们讲到了sizeclass在storeboard和xib中的使用,现在大家应该也都会用了。有的人问了sizeclass只能与Interface Builder一起使用吗?
答案当然是不是喽。
Apple公司在iOS8引入新的类专门用于纯代码使用sizeclass而准备的,这个类叫 UITraitCollection,可以使用一下几个方法进行初始化:
1)+ (UITraitCollection *)traitCollectionWithHorizontalSizeClass:(UIUserInterfaceSizeClass)horizontalSizeClass;
2)+ (UITraitCollection *)traitCollectionWithVerticalSizeClass:(UIUserInterfaceSizeClass)verticalSizeClass;
3)+ (UITraitCollection *)traitCollectionWithUserInterfaceIdiom:(UIUserInterfaceIdiom)idiom;
4)+ (UITraitCollection *)traitCollectionWithDisplayScale:(CGFloat)scale;
5)+ (UITraitCollection *)traitCollectionWithTraitsFromCollections:(NSArray *)traitCollections;
可以先使用前四个方法生成几个你预想设置的sizeclass的特性对象,最终通过方法5初始化sizeclass特性集合。
eg:
// 垂直方向特征
UITraitCollection *verticaTrait =
[UITraitCollection traitCollectionWithVerticalSizeClass:
UIUserInterfaceSizeClassUnspecified];
// 水平方向特征
UITraitCollection *horizontalTrait =
[UITraitCollection traitCollectionWithHorizontalSizeClass:
UIUserInterfaceSizeClassCompact];
// Device特征设置为iphone
UITraitCollection *iphoneIdiomTrait =
[UITraitCollection traitCollectionWithUserInterfaceIdiom:
UIUserInterfaceIdiomPhone];
// iphone 竖屏sizeclass情况
UITraitCollection *sizeclassTraitCollection =
[UITraitCollection traitCollectionWithTraitsFromCollections:
@[iphoneIdiomTarit, horizontalTarit]];
同时还可以在最终初始化sizeclass特性集合之前进行scale的设置,这可是个很牛(yin)叉(dang)的技能:
// Retina屏幕
UITraitCollection *scaleTraitCollection =
[UITraitCollection traitCollectionWithDisplayScale:2.0];
其中scale = 1.0为普通屏幕,scale = 2.0为Retina屏幕,scale > 2.0为更高的显示比例(dpi大于Retina屏幕的)屏幕。
在开始sizeclass布局界面之前还不得不介绍一下UITraitEnvironment这个协议,iOS8后UIScreen、UIWindow、UIViewController、UIView以及iOS8新出的UIPresentationController都遵守这个协议,使得这些类以及他们的子类都有traitCollection这个只读属性,让我们可以通过这个属性布局不同的sizeclass场景。
eg:
// 只能在Retina屏幕(326dpi)的iPhone上显示
if ([self.traitCollection containsTraitsInCollection:sizeclassTaritCollection]) {
UIView *viewTemp = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
viewTemp.backgroundColor = [UIColor cyanColor];
[self.view addSubview:viewTemp];
}
注:
traitCollection使用起来很猥琐,请花点时间把这点儿看完思密达,注意containsTraitsInCollection:这个是否包含特征集合的方法,特征集合是否包含另一个特征集合,是一个子集判断,而不是Interface Builder里sizeclass的any包含compact和regular,请不要将两者混为一谈。
同时候还可以在UIScreen、UIWindow、UIViewController、UIView、UIPresentationController里面实现UITraitEnvironment协议的traitCollectionDidChange:代理方法去监控sizeclass特性的转变。