字體設配
- 1.iPhone4和iPhone5寬度一樣,5只是比4高176像素阳距,所以5和4一套規(guī)范即可塔粒;
- 2.iPhone6的放大模式分辨率是640 x 1136,和iPhone5正好相同筐摘;
- 3.iPhone6的標準模式分辨率為750 x 1334卒茬,整體放大1.5倍正好是iPhone6 Plus的放大模式1125*2001。
總結(jié):我們可以看出iPhone 4蓄拣、5扬虚、6共用一套字體大小規(guī)范。iPhone6 plus在放大模式下的字體正好是在此基礎上放大了1.5倍:
UI適配
手動
可以根據(jù)UIDevice 或直接使用屏幕寬度 判斷設配的手機型號球恤,并作適配辜昵,一般用于接口適配;UI適配不推薦使用咽斧!
Frame
簡單的中點設置可以通過frame的設置方法堪置,Autolayout出來之后還是推薦使用Autolayout躬存,一句話:丟掉Frame,擁抱Autolayout舀锨!
Autoresizing
Autolayout之前的版本岭洲,使用相當方便,但只能控制當前子控件對于其父控件的排版坎匿。
-
sb盾剩,xib中直接設置
正方形外 上下左右線:選中對應線代表子控件和父控件某個邊緣的間距是固定的
正方形內(nèi) 上下左右線: 選中對應線代表:對應的子控件的的長或?qū)捵詣痈S父控件改變 - 代碼設置:通過屬性:
autoresizingMask
直接設置。
注意:位置設置方式與連線方式相反替蔬,是設置某邊可伸縮告私,反之就是對應邊角固定,伸縮方式一致承桥。例如需要設置底部邊固定驻粟,則需要設置top。
- UIViewAutoresizingFlexible`Left`Margin = 1 << 0,
- 距離父控件`左邊`的間距是伸縮的
- UIViewAutoresizingFlexible`Right`Margin = 1 << 2,
- 距離父控件`右邊`的間距是伸縮的
- UIViewAutoresizingFlexible`Top`Margin = 1 << 3,
- 距離父控件`上邊`的間距是伸縮的
- UIViewAutoresizingFlexible`Bottom`Margin = 1 << 5
- 距離父控件`下邊`的間距是伸縮的
- UIViewAutoresizingFlexible`Width` = 1 << 1,
- `寬度`跟隨父控件`寬度`進行伸縮
- UIViewAutoresizingFlexible`Height` = 1 << 4,
- `高度`跟隨父控件`高度`進行伸縮
Autolayout
最常用的適配方法凶异,在iOS6/Xcode4的時候被蘋果引入兩個核心概念:參照蜀撑,約束.即參照其他控件的位置添加約束,來確定需要適配的控件的唯一大小和位置剩彬。核心公式為:
obj1.property1 =(obj2.property2 * multiplier)+ constant value
注意:
- 要先禁止autoresizing功能酷麦,view.translatesAutoresizingMaskIntoConstraints = NO;
- 添加約束之前,一定要保證相關(guān)控件都已經(jīng)在各自的父控件上
- 不用再給view設置frame
- 各種適配方法不能混用
- 動畫 :用強制更新約束方法(layoutIfNeeded)襟衰,
- NSLayoutConstraint
直接是公式的代碼化贴铜,添加代碼相當繁瑣,一般不適用瀑晒!
/**
view1 :要約束的控件
attr1 :約束的類型(做怎樣的約束)
relation :與參照控件之間的關(guān)系
view2 :參照的控件
attr2 :約束的類型(做怎樣的約束)
multiplier :乘數(shù)
c :常量
*/
----創(chuàng)建約束
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c;
----添加約束
- (void)addConstraint:(NSLayoutConstraint *)constraint;
- (void)addConstraints:(NSArray *)constraints;
- VFL
VFL全稱是Visual Format Language绍坝,翻譯過來是“可視化格式語言” VFL是蘋果公司為了簡化Autolayout的編碼而推出的抽象語言,是常用的約束添加方式苔悦。
// 水平方向
NSString *vlf = @"H:|-margin-[blueView]-margin-[redView(==blueView)]-margin-|";
NSDictionary *views = @{ @"blueView" : blueView, @"redView" : redView };
NSDictionary *metrics = @{@"margin" : @20};
// 所有控件的頂部\底部對齊
NSLayoutFormatOptions opts = NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom;
NSArray *lcs = [NSLayoutConstraint constraintsWithVisualFormat:vlf options:opts metrics:metrics views:views];
[self.view addConstraints:lcs];
// 垂直方向
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[blueView(40)]-margin-|" options:kNilOptions metrics:metrics views:views]];
- masonry
一個非常不錯的第三方庫轩褐,基于塊的方式來添加約束,使用非常簡單
UIEdgeInsets padding = UIEdgeInsetsMake(10, 10, 10, 10);
[view1 mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.equalTo(superview.mas_top).with.offset(padding.top);
make.left.equalTo(superview.mas_left).with.offset(padding.left);
make.bottom.equalTo(superview.mas_bottom).with.offset(-padding.bottom);
make.right.equalTo(superview.mas_right).with.offset(-padding.right);
}];
Size Classes
iOS8之后玖详,蘋果推出的適配的新技術(shù)把介。
- 它僅僅是對屏幕進行了分類, 真正排布UI元素還得使用autolayout
- 不再有橫豎屏的概念, 只有屏幕尺寸概念
- 不再有具體尺寸的概念, 只有抽象尺寸的概念: 把寬度和高度各分為3種情況
- Compact : 緊湊(小)
- Any : 任意
- Regular : 寬松(大)
- 各屏幕適配
- iPhone4S,iPhone5/5s,iPhone6
豎屏:(w:Compact h:Regular) 橫屏:(w:Compact h:Compact) i - Phone6 Plus:
豎屏:(w:Compact h:Regular) 橫屏:(w:Regular h:Compact)
- iPhone4S,iPhone5/5s,iPhone6
- iPad
豎屏:(w:Regular h:Regular) 橫屏:(w:Regular h:Regular) - Apple Watch(猜測)
豎屏:(w:Compact h:Compact) 橫屏:(w:Compact h:Compact)
所以,正確的使用姿勢應該是通過sizeclass對屏幕進行分類蟋座,再通過autolayout:對屏幕中各種元素進行約束(位置\尺寸)拗踢。