最近一直在考虑适配 iphone6 的一些问题,其实只要会用autoLayout适配起来也大概差不多!只要判断设备的SizeClaeese根据不同的尺寸注备好相应的约束就可以了
//表示 iphone手机所有机型竖屏
#define isIphonePortrait (newCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular)
//表示 iphone手机所有机型横屏 除了iphone6 plus
#define isIphoneLandscape (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact)
大部分的手机除了 IPhone 6 Plus 其他的手机大致都可以使用一套布局约束!IPhone 6 Plus 也只是在横屏下面SizeClasses才会改变。
//表示 iphone6 plus的横屏状态
#define isIphone6PlusLandscape (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)
iPad的话横屏竖屏都是一个样
//表示 Ipad 的横竖屏状态
#define isIpad (newCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular && newCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular)
然后我们只需要在对应的判断里面写出相应的约束就可以了,这里给出我写的一些代码片段,大家注意我这里的自动布局用到了一个第三方库文件, Masonry,大家可以在github找到!
//获取设备的SizeClasses信息
UITraitCollection *newCollection = self.traitCollection;
//判断设备的SizeClasses
if (isIphonePortrait) {
NSLog(@"iphone 竖屏");
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
//[_btn setTitle:@"出现在IPhone" forState:UIControlStateNormal];
[_scrollView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.view.mas_centerY);//垂直居中
make.width.equalTo((self.view).mas_width);
make.height.equalTo(@250);
}];
[_page mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.equalTo(_scrollView.mas_centerX);//分页指示器的水平居中
make.bottom.equalTo(_scrollView.mas_bottom).offset(-padding.bottom);//分页指示器离_scrollView的底部 10
make.height.equalTo(@20);
make.width.equalTo(@20);
}];
//btn添加约束
[_btn mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(_scrollView.mas_centerY);//让btn的 垂直中线 对住_scrollView的垂直中线
make.left.equalTo(_scrollView.mas_left); //btn的最左边对着_scrollerView的最左边
make.right.equalTo(_btn2.mas_left); //btn和btn2的间隔为0
make.width.equalTo(_scrollView.mas_width);
make.height.equalTo(_scrollView.mas_height);
}];
//给 btn2 添加布局约束
[_btn2 mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(_scrollView.mas_centerY);//让btn2的 垂直中线 对住_scrollView的垂直中线
make.right.equalTo(_scrollView.mas_right);// 让btn2的最右侧对准_scrollView的最右侧
make.width.equalTo(_btn);// btn2的宽度等于btn1的宽度
make.height.equalTo(_btn);//btn2的高度等于 btn的高度
}];
}else if(isIpad){
NSLog(@"ipad");
//ipad布局设定
}else if (isIphoneLandscape){
//横屏时启动时的布局设定
NSLog(@"iphone 横屏");
}else if (isIphone6PlusLandscape){
//横屏时启动时的布局设定
NSLog(@"iphone 6 plus 横屏");
}
然后在设备运行时,当你切换了设备的方向,SizeClasses也会做出相应的改变你可以通过代理方法来获取设备的
SizeClasses,然后根据相应的设备信息重新定义约束
/**
* 当设备改变朝向时
* 返回当前屏幕sizeClaeese的尺寸信息的代理方法
*
* @param newCollection 包含了屏幕的sizeClasees的信息
* @param coordinator
*/
-(void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{
[super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator];
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
if (isIphonePortrait) {
//写布局内容的改变 无改变就不用写
NSLog(@"iphone 竖屏");
}else if(isIpad){
//写布局内容的改变 无改变就不用写
NSLog(@"ipad");
}else if (isIphoneLandscape){
//写布局内容的改变 无改变就不用写
NSLog(@"iphone 横屏");
}else if (isIphone6PlusLandscape){
//写布局内容的改变 无改变就不用写
NSLog(@"iphone 6 plus 横屏");
}
} completion:nil];
}
嗯,因为也是前两天开始研究的!就说到这!也是第一次写博文,不足之处还望大家海涵!!