您的位置:首页 > 编程语言

纯代码sizeclass使用

2015-07-21 17:40 375 查看
王叫兽又回来了,上一集我们讲到了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:

if ([self.traitCollection containsTraitsInCollection:sizeclassTaritCollection]) {
UIView *viewTemp = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
        viewTemp.backgroundColor = [UIColor cyanColor];
        [self.view addSubview:viewTemp];
}// 只能在Retina屏幕(326dpi)的iPhone上显示


注:traitCollection使用起来很猥琐,请花点时间把这点儿看完思密达,注意containsTraitsInCollection:这个是否包含特征集合的方法,

特征集合是否包含另一个特征集合,是一个子集判断,而不是Interface Builder里sizeclass的any包含compact和regular,请不要将

两者混为一谈。

同时候还可以在UIScreen、UIWindow、UIViewController、UIView、UIPresentationController里面实现UITraitEnvironment

协议的traitCollectionDidChange:代理方法去监控sizeclass特性的转变。

demo今晚下班做一下会更新地址,敬请期待思密达。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: