Michael

写写代码,说说人生

您好,我是Michael,欢迎来到我的个人家园。
代码搬运工,目前就职于XX证券,努力修行中。


H5 / Java / Objc / Swift / Vue / RN

纯代码sizeclass使用

叫兽又回来了,之前我们讲到了sizeclassstoreboardxib中的使用,现在大家应该也都会用了。有的人问了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 Buildersizeclassany包含compactregular,请不要将两者混为一谈。

同时候还可以在UIScreen、UIWindow、UIViewController、UIView、UIPresentationController里面实现UITraitEnvironment协议的traitCollectionDidChange:代理方法去监控sizeclass特性的转变。

最近的文章

关于 iOS “[App] if we're in the real....

错误描述 iOS “[App] if we’re in the real pre-commit handler we can’t actually add any new fences due最近运行APP,发现了这个问题,本着宁可错看,不可放过的原则,上stackoverFlow学习了一下:----- “[App] if we're in the real pre-commit handler we can't actually add any new fences due ”翻译:-...…

Xcode编译错误继续阅读
更早的文章

关于 iOS8 Size Classes的理解与使用​

Size Classes是什么iOS 8在应用界面的可视化设计上添加了一个新的特性-Size Classes,对于任何设备来说,界面的宽度和高度都只分为两种描述:正常和紧凑。这样开发者便可以无视设备具体的尺寸,而是对这两类和它们的组合进行适配。这样不论在设计时还是代码上,我们都可以不再受限于具体的尺寸,而是变成遵循尺寸的视觉感官来进行适配。在Xcode中的具体体现如下图:但是我们看到图中的宽度和高度都是Any,Any是什么意思呢?如果weight设为Any,height设置为Regular...…

iOS开发继续阅读