真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

UIKit框架(8)屏幕適配(二)-創(chuàng)新互聯(lián)

  • AutoLayout介紹

    從網(wǎng)站建設(shè)到定制行業(yè)解決方案,為提供成都網(wǎng)站制作、成都做網(wǎng)站服務(wù)體系,各種行業(yè)企業(yè)客戶提供網(wǎng)站建設(shè)解決方案,助力業(yè)務(wù)快速發(fā)展。創(chuàng)新互聯(lián)建站將不斷加快創(chuàng)新步伐,提供優(yōu)質(zhì)的建站服務(wù)。

AutoLayout的功能要比AutoResizing強(qiáng)大的多。

     當(dāng)對(duì)一個(gè)UIView對(duì)象使用了AutoLayout布局后,意味著放棄了通過(guò)對(duì)象的frame進(jìn)行修改視圖的位置、尺寸。

     AutoLayout使約束條件,通過(guò)自動(dòng)布局引擎,計(jì)算view對(duì)象的frame。

     可以認(rèn)為在AutoLayout中view對(duì)象的frame是一個(gè)只讀的屬性。

約束的核心公式:

    view1.attr1 = (view2.attr2 * multiplier) + constraint

   其中obj2可以是nil

   除了=關(guān)系外,還可以是>= <=的關(guān)系

  • 代碼適配

添加約束的步驟:

1)禁止被適配view的AutoResizing功能

- (BOOL)translatesAutoresizingMaskIntoConstraints
- (void)setTranslatesAutoresizingMaskIntoConstraints:(BOOL)flag

2)創(chuàng)建約束對(duì)象NSLayoutConstraint

+ (instancetype)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c

   參數(shù)即約束的核心公式

   NSLayoutRelation枚舉:

enum {
   NSLayoutRelationLessThanOrEqual = -1,
   NSLayoutRelationEqual = 0,
   NSLayoutRelationGreaterThanOrEqual = 1,
};
typedef NSInteger NSLayoutRelation;

   NSLayoutAttribute枚舉:

typedef enum: NSInteger {
   NSLayoutAttributeLeft = 1,
   NSLayoutAttributeRight,
   NSLayoutAttributeTop,
   NSLayoutAttributeBottom,
   NSLayoutAttributeLeading,
   NSLayoutAttributeTrailing,
   NSLayoutAttributeWidth,
   NSLayoutAttributeHeight,
   NSLayoutAttributeCenterX,
   NSLayoutAttributeCenterY,
   NSLayoutAttributeBaseline,
   NSLayoutAttributeLastBaseline = NSLayoutAttributeBaseline,
   NSLayoutAttributeFirstBaseline,
   NSLayoutAttributeLeftMargin,
   NSLayoutAttributeRightMargin,
   NSLayoutAttributeTopMargin,
   NSLayoutAttributeBottomMargin,
   NSLayoutAttributeLeadingMargin,
   NSLayoutAttributeTrailingMargin,
   NSLayoutAttributeCenterXWithinMargins,
   NSLayoutAttributeCenterYWithinMargins,
   
   NSLayoutAttributeNotAnAttribute = 0} NSLayoutAttribute;

3)在UIView對(duì)象上添加約束對(duì)象

- (void)addConstraint:(NSLayoutConstraint *)constraint
- (void)addConstraints:(NSArray *)constraints

將約束添加到哪個(gè)view對(duì)象上應(yīng)按照以下規(guī)則:

     對(duì)于同級(jí)view之間的約束關(guān)系,添加到它們的父控件上

     對(duì)于不同級(jí)view之間的約束關(guān)系,添加到最近的共同父控件上

     對(duì)于有層級(jí)關(guān)系的兩個(gè)view之間約束關(guān)系,添加到層次較高的的空間上

注意:約束不能重復(fù)添加,不能缺少必要的約束

   添加約束的過(guò)程中非常容易出現(xiàn)無(wú)法計(jì)算出frame的情況

UIView的其他操作約束的方法:

- (NSArray *)constraints
- (void)removeConstraint:(NSLayoutConstraint *)constraint
- (void)removeConstraints:(NSArray *)constraints

  • AutoLayout的補(bǔ)充

AutoLayout的動(dòng)畫:

   代碼中如果修改了約束的數(shù)值,則執(zhí)行下面的代碼,就能產(chǎn)生相應(yīng)的動(dòng)畫效果。

[UIView animateWithDuration:1.0 animations:^{
    [view layoutIfNeeded];
}];

     哪個(gè)view中的約束變化了,哪個(gè)view對(duì)象調(diào)用layoutIfNeed方法

     約束的變化應(yīng)在動(dòng)畫之前完成。

UILabel、UIButton這類顯示文字的控件使用AutoLayout的好處:

   使用了恰當(dāng)?shù)募s束,能夠使其尺寸自動(dòng)匹配。

     如設(shè)置了UILabel對(duì)象的上、左、右的規(guī)定邊距,則UILabel的尺寸會(huì)根據(jù)文字自動(dòng)適應(yīng)。

  • 約束的VFL方式

   Visual Format Language,可視化格式語(yǔ)言,是蘋果公司為了簡(jiǎn)化AutoLayout的編碼而推出的抽象語(yǔ)言。

     其實(shí)不能稱之為“語(yǔ)言”,可以認(rèn)為這僅僅是一種“語(yǔ)法”,其目的是減少代碼使用AutoLayout的編程量

     但實(shí)際減少的程度有限,有些約束的功能使用VFL也無(wú)法完成,但在實(shí)現(xiàn)一些簡(jiǎn)單約束時(shí)非常有效。

NSLayoutConstraint的另一個(gè)創(chuàng)建方法:

+ (NSArray *)constraintsWithVisualFormat:(NSString *)format options:(NSLayoutFormatOptions)opts metrics:(NSDictionary *)metrics views:(NSDictionary*)views

   format參數(shù):VFL語(yǔ)句

   views參數(shù):VFL中出現(xiàn)的對(duì)象“鍵值對(duì)”

   metrics:占位符

   返回一組約束對(duì)象

VFL語(yǔ)句示意:

UIKit框架(8)屏幕適配(二)

如:

canelButton寬72,acceptButton寬50,它們之間間距12

 H:[cancelButton(72)]-12-[acceptButton(50)]

wideView寬度大于等于60point,該約束條件優(yōu)先級(jí)為700(優(yōu)先級(jí)大值為1000,優(yōu)先級(jí)越高的約束越先被滿足)

H:[wideView(>=60@700)]

豎直方向上,先有一個(gè)redBox,其下方緊接一個(gè)高度等于redBox高度的yellowBox

 V:[redBox]-[yellowBox(==redBox)]

水平方向上,F(xiàn)ind距離父view左邊緣默認(rèn)間隔寬度,之后是FindNext距離Find間隔默認(rèn)寬度;再之后是寬度不小于20的FindField,它和FindNext以及父view右邊緣的間距都是默認(rèn)寬度。(豎線“|” 表示superview的邊緣)

 H:|-10-[Find]-[FindNext]-[FindField(>=20)]-|

  • ZXPAutoLayout

號(hào)稱最輕巧的自動(dòng)布局,簡(jiǎn)化了NSLayoutConstraint的繁瑣,采用新穎的鏈?zhǔn)秸Z(yǔ)法,可擴(kuò)展性強(qiáng),維護(hù)成為低。

使用 zxp_addAutoLayout添加布局, 如:

[self.redView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {

}];

單個(gè)view的布局關(guān)系:

    在superview中的內(nèi)邊距:

@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^topSpace)(CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^leftSpace)(CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^bottomSpace)(CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^rightSpace)(CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^edgeInsets)(UIEdgeInsets insets);

    如:

[self.redView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {
        //layout.topSpace(20);
        //layout.bottomSpace(30);
        //layout.leftSpace(40);
        //layout.rightSpace(50);
        layout.edgeInsets(UIEdgeInsetsMake(20, 30, 40, 50));
}];

居中操作:

@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^xCenterByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^yCenterByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^centerByView)(UIView *view,CGFloat value);

    參數(shù)view應(yīng)為superview

寬高操作:

@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^widthValue)(CGFloat value);
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^heightValue)(CGFloat value);

   如:

[self.redView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {
    layout.xCenterByView(self.view, 0);
    layout.yCenterByView(self.view, -100);
    layout.widthValue(100);
    layout.heightValue(100);
}];

兩個(gè)view的布局關(guān)系:

//與另一個(gè)view的內(nèi)邊距相等
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^edgeEqualTo)(UIView *view);       
//當(dāng)前的top距離view為value點(diǎn)坐標(biāo)距離
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^topSpaceByView)(UIView *view,CGFloat value); 
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^leftSpaceByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^bottomSpaceByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^rightSpaceByView)(UIView *view,CGFloat value);
//當(dāng)前top內(nèi)邊距值與view的相等
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^topSpaceByView)(UIView *view,CGFloat value); 
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^leftSpaceByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^bottomSpaceByView)(UIView *view,CGFloat value);
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^rightSpaceByView)(UIView *view,CGFloat value);
//與view等寬
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^widthEqualTo)(UIView *view,CGFloat value); 
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^heightEqualTo)(UIView *view, CGFloat value);

   如:

[self.redView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {
    layout.xCenterByView(self.view, 0);
    layout.yCenterByView(self.view, -100);
    layout.widthValue(100);
    layout.heightValue(100);
}];
[self.blueView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {
    layout.topSpaceByView(self.redView, 100);
    layout.heightEqualTo(self.redView, 0);
    layout.widthEqualTo(self.redView, 0);
    layout.leftSpaceEqualTo(self.redView, 0);
}];

自適應(yīng)操作:(對(duì)UILabel有效)

@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^autoHeight)();
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^autoHeightByMin)(CGFloat value);
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^autoWidth)();
@property (copy,nonatomic,readonly) ZXPAutoLayoutMaker *(^autoWidthByMin)(CGFloat value);

其他操作:

@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^priority)(UILayoutPriority priority); //優(yōu)先級(jí)
@property (copy, nonatomic, readonly) ZXPAutoLayoutMaker *(^multiplier)(CGFloat multiplier); //約束的倍數(shù)

   如:

[self.blueView zxp_addConstraints:^(ZXPAutoLayoutMaker *layout) {
    layout.topSpaceByView(self.redView, 100);
    layout.heightEqualTo(self.redView, 0).multiplier(0.5);
    layout.widthEqualTo(self.redView, 0);
    layout.leftSpaceEqualTo(self.redView, 0);
}];

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


網(wǎng)站題目:UIKit框架(8)屏幕適配(二)-創(chuàng)新互聯(lián)
本文來(lái)源:http://weahome.cn/article/dpchjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部