LayoutMargin & preservesSuperviewLayoutMargins 學(xué)習(xí)筆記

發(fā)現(xiàn)問題

在IB中拖放tableView,大小為設(shè)置為屏幕大小后,添加了四個(gè)方向的約束绍载,發(fā)現(xiàn)诡宗,約束的值居然不是和想象中不太一樣,不是0击儡。

1.png

接著打開attribute inspector,發(fā)現(xiàn)約束信息如下:


2.png

在這里發(fā)現(xiàn)Second Item是superView 的 leading Margin. 而不是superView的leading塔沃,所以約束的值不是0,但leading margin又是什么阳谍?

Layout Magrin

通過查找文檔蛀柴,發(fā)現(xiàn)這是iOS 8 以后,UIView 新增的一個(gè)屬性矫夯,layoutMargins. 表示一個(gè)View的內(nèi)邊距鸽疾。

文檔

@property(nonatomic) UIEdgeInsets layoutMargins;
The default spacing to use when laying out content in the view.

typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;  // specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;

這個(gè)屬性類似Android中的padding,用于父View設(shè)置子View布局的內(nèi)邊距训貌。

The default margins are eight points on each side.

默認(rèn)值是8個(gè)點(diǎn)制肮,可修改。

If the view is a view controller’s root view, the system sets and manages the margins. The top and bottom margins are set to zero points. The side margins vary depending on the current size class, but can be either 16 or 20 points. You cannot change these margins.

但如果递沪,是ViewController的rootView豺鼻,layoutMargins 是系統(tǒng)設(shè)置和控制的,不能修改款慨。(文章最開始的tableView到 leading Margin 約束為 -16.就說明儒飒,left margin是16點(diǎn)。)

到這里檩奠,其實(shí)對layoutMargins理解都較為清晰约素,但是文檔中還提到了一個(gè)與layoutMargins 相關(guān)的屬性: preservesSuperviewLayoutMargins

When the edge of your view is close to the edge of the superview and the preservesSuperviewLayoutMargins property is YES, the actual layout margins may be increased to prevent content from overlapping the superview’s margins.

讀完感覺字面意思都懂,但就是不知道是什么意思笆凌。

preservesSuperviewLayoutMargins

@property(nonatomic) BOOL preservesSuperviewLayoutMargins;
A Boolean value indicating whether the current view also respects the margins of its superview.
The default value of this property is NO.

一個(gè)BOOL值圣猎,決定當(dāng)前View布局是否也考慮父View的layoutMargins.
默認(rèn)是NO.

到這里還是暈的,沒看懂這個(gè)屬性是干嘛乞而,繼續(xù)看文檔送悔。

文檔

When the value of this property is YES, the superview’s margins are also considered when laying out content. This margin affects layouts where the distance between the edge of a view and its superview is smaller than the corresponding margin.

當(dāng)這個(gè)屬性是YES的時(shí)候,父view的layoutMargins會被考慮到當(dāng)前View的布局中爪模。也就是說欠啤,當(dāng)前View和父View的內(nèi)邊距,小于父View相應(yīng)layoutMargins中對應(yīng)的內(nèi)邊距時(shí)屋灌,父View的內(nèi)邊距會決定當(dāng)前View的布局洁段。還是有些抽象。

For example, you might have a content view whose frame precisely matches the bounds of its superview. When any of the superview’s margins is inside the area represented by the content view and its own margins, UIKit adjusts the content view’s layout to respect the superview’s margins. The amount of the adjustment is the smallest amount needed to ensure that content is also inside the superview’s margins.

這里大概的意思就是共郭,你有一個(gè)contentView祠丝,它的大小和父View一樣大的你設(shè)置了contentView的preservesSuperviewLayoutMargins為YES疾呻,當(dāng)你對contentView中的子View進(jìn)行布局的時(shí)候,如果有子View的所在位置(比如:子View到contentView的左邊距写半,小于父View的LayoutMargin 對應(yīng)的左內(nèi)邊距)UIKit就會對子View進(jìn)行一些調(diào)整岸蜗。
感覺看了這一段稍微清晰了一些,可是寫代碼想實(shí)現(xiàn)一個(gè)demo的時(shí)候叠蝇,發(fā)現(xiàn)這個(gè)preservesSuperviewLayoutMargins屬性好像并沒有什么卵用璃岳。
最后再Google上搜到了這篇文章。
iOS8 Day-by-Day :: Day 32 :: Layout Margins

然后自己實(shí)現(xiàn)了一個(gè) demo 如下

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //創(chuàng)建一個(gè)紅色的View悔捶,大小和手機(jī)屏幕一樣大铃慷,
    //layoutMargin 為(100,100蜕该,100枚冗,100)
    UIView *redView = [[UIView alloc] init];
    redView.backgroundColor = [UIColor redColor];
    redView.translatesAutoresizingMaskIntoConstraints = NO;
    redView.layoutMargins = UIEdgeInsetsMake(100, 100, 100, 100);
    [self.view addSubview:redView];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0)-[redView]-(0)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(redView)]];
    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(0)-[redView]-(0)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(redView)]];
    
    //創(chuàng)建一個(gè)綠色的View,作為我們的ContentView蛇损,父View為紅色的View
    //約束為到紅色View各邊距為10赁温,但紅色View 的layoutMargin 還是再綠色View內(nèi)
    //設(shè)置綠色View preservesSuperviewLayoutMargins 為YES
    UIView *greenView = [[UIView alloc] init];
    greenView.backgroundColor = [UIColor greenColor];
    greenView.translatesAutoresizingMaskIntoConstraints = NO;
    greenView.preservesSuperviewLayoutMargins = YES;
    [redView addSubview:greenView];
    [redView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(10)-[greenView]-(10)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(greenView)]];
    [redView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(10)-[greenView]-(10)-|" options:NSLayoutFormatDirectionLeadingToTrailing metrics:nil views:NSDictionaryOfVariableBindings(greenView)]];
    
    //創(chuàng)建一個(gè)藍(lán)色View,作為綠色View的子View
    UIView *blueView = [[UIView alloc] init];
    blueView.backgroundColor = [UIColor blueColor];
    blueView.translatesAutoresizingMaskIntoConstraints = NO;
    [greenView addSubview:blueView];
    
    //注意淤齐,leading 約束對應(yīng)的第二item 屬性為 leading.margin
    [greenView addConstraint: [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:greenView attribute:NSLayoutAttributeLeadingMargin multiplier:1.0 constant:0.0]];
    // trailing 屬性 為父View trailig - 8.0// 8.0 是默認(rèn)layout Margin
    [greenView addConstraint: [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:greenView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:-8.0]];
    [greenView addConstraint: [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:greenView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]];
    [greenView addConstraint: [NSLayoutConstraint constraintWithItem:blueView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:greenView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]];
}
3.png

總結(jié)

最后總結(jié)一下preservesSuperviewLayoutMargins生效的要點(diǎn):(如果總結(jié)的不對希望大家指正~)
1.preservesSuperviewLayoutMargins 只在自動布局情況下生效
2.contentView(設(shè)置preservesSuperviewLayoutMargins的View)的父View的LayoutMargin中股囊,至少存在contentView 某一個(gè)方向到父View的邊距,小于父View LayoutMargin 對應(yīng)的內(nèi)邊距更啄。(就比如上面栗子中稚疹,綠色View到紅色View的左邊距是10,紅色View的LayoutMargin中對應(yīng)的左內(nèi)邊距為100)
3.設(shè)置自動布局約束的時(shí)候祭务,一定要設(shè)置Margin相關(guān)的約束(iOS8以上有效)

typedef NS_ENUM(NSInteger, NSLayoutAttribute) {
   ...
    
    NSLayoutAttributeLeftMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeRightMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeTopMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeBottomMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeLeadingMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeTrailingMargin NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeCenterXWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),
    NSLayoutAttributeCenterYWithinMargins NS_ENUM_AVAILABLE_IOS(8_0),
    
};

思考

現(xiàn)在基本上弄清楚了内狗,LayoutMargin和preservesSuperviewLayoutMargins屬性,以及如何使用义锥,但是對他們在自動布局的實(shí)際使用場景還是沒有思考太清楚柳沙,沒有明白蘋果為什么會設(shè)置這兩個(gè)屬性,特別是preservesSuperviewLayoutMargins屬性拌倍。 = =

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赂鲤,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子柱恤,更是在濱河造成了極大的恐慌数初,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗顺,死亡現(xiàn)場離奇詭異泡孩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寺谤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門仑鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吮播,“玉大人,你說我怎么就攤上這事锈候。” “怎么了敞贡?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵泵琳,是天一觀的道長。 經(jīng)常有香客問我誊役,道長获列,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任蛔垢,我火速辦了婚禮击孩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹏漆。我一直安慰自己巩梢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布艺玲。 她就那樣靜靜地躺著括蝠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饭聚。 梳的紋絲不亂的頭發(fā)上忌警,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音秒梳,去河邊找鬼法绵。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酪碘,可吹牛的內(nèi)容都是我干的朋譬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼兴垦,長吁一口氣:“原來是場噩夢啊……” “哼此熬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起滑进,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤犀忱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扶关,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體阴汇,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年节槐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搀庶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拐纱。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哥倔,靈堂內(nèi)的尸體忽然破棺而出秸架,到底是詐尸還是另有隱情,我是刑警寧澤咆蒿,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布东抹,位于F島的核電站,受9級特大地震影響沃测,放射性物質(zhì)發(fā)生泄漏缭黔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蒂破、第九天 我趴在偏房一處隱蔽的房頂上張望馏谨。 院中可真熱鬧,春花似錦附迷、人聲如沸惧互。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽壹哺。三九已至,卻和暖如春艘刚,著一層夾襖步出監(jiān)牢的瞬間管宵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工攀甚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箩朴,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓秋度,卻偏偏與公主長得像炸庞,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子荚斯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容