3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
是的,可以這樣做。
如果設(shè)置了視圖的translatesAutoresizingMaskIntoConstraints = YES,則setFrame:在運(yùn)行時(shí)會(huì)根據(jù)視圖的current將對(duì)的調(diào)用自動(dòng)轉(zhuǎn)換為布局約束autoresizingMask。這使您可以將基于框架的布局與基于約束的布局混合使用。
例如,您可以使用“自動(dòng)布局”來定義視圖的所有子視圖的布局,但是仍然可以調(diào)用setFrame:來設(shè)置視圖本身的大小和位置。從您的角度來看,您正在結(jié)合使用自動(dòng)版面設(shè)計(jì)和直接框架操作來進(jìn)行版面設(shè)計(jì)。但是系統(tǒng)實(shí)際上是使用約束來處理所有事情。
但是,關(guān)于使用存在一個(gè)大警告translatesAutoresizingMaskIntoConstraints。
執(zhí)行此操作時(shí),您仍然需要確保其余約束可以滿足這些自動(dòng)約束。
因此,例如,假設(shè)已經(jīng)有確定視圖大小和位置的約束,然后還要設(shè)置translatesAutoresizingMaskIntoConstraints = YES和調(diào)用setFrame:。調(diào)用setFrame:將在視圖上生成新的約束,這可能與已經(jīng)存在的約束沖突。
(實(shí)際上,此錯(cuò)誤經(jīng)常發(fā)生。如果您看到一條日志消息抱怨約束沖突,并且其中一個(gè)約束是NSAutoresizingMaskLayoutConstraint,則您看到的是與自動(dòng)約束沖突。這是一個(gè)簡(jiǎn)單的錯(cuò)誤,因?yàn)閠ranslatesAutoresizingMaskIntoConstraints = YES是默認(rèn)值,因此,如果您要在代碼中配置約束,則在不需要這些自動(dòng)約束時(shí),請(qǐng)記住將其關(guān)閉。)
相反,再次假設(shè)已經(jīng)存在確定視圖大小和位置的約束,但是translatesAutoresizingMaskIntoConstraints = NO在調(diào)用之前先進(jìn)行設(shè)置setFrame:。在這種情況下,您的setFrame:調(diào)用不會(huì)產(chǎn)生新的約束,因此單獨(dú)的約束之間不會(huì)發(fā)生沖突。但是,在這種情況下,約束和您設(shè)置的幀值之間仍然存在“沖突” 。下次調(diào)用自動(dòng)布局時(shí),它將在視圖上看到已經(jīng)存在的約束,計(jì)算它們所需的框架值,并將框架設(shè)置為所需的值本身,從而破壞了您手動(dòng)設(shè)置的值。
有關(guān)更多詳細(xì)信息,請(qǐng)查看Apple的Cocoa自動(dòng)布局指南中的 “采用自動(dòng)布局”部分。

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超4個(gè)贊
對(duì)我來說,最簡(jiǎn)單的事情是從其超級(jí)視圖中刪除要移動(dòng)/調(diào)整大小的視圖,設(shè)置其frame,然后重新添加。例如,UILabel在UITableViewCell子類中采用自定義:
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
- 3 回答
- 0 關(guān)注
- 633 瀏覽
添加回答
舉報(bào)