3 回答

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

TA貢獻1780條經驗 獲得超4個贊
對我來說,最簡單的事情是從其超級視圖中刪除要移動/調整大小的視圖,設置其frame,然后重新添加。例如,UILabel在UITableViewCell子類中采用自定義:
[cell.myLabel removeFromSuperview];
cell.myLabel.frame = someFrameIGenerated;
[cell.contentView addSubview:cell.myLabel];
- 3 回答
- 0 關注
- 626 瀏覽
添加回答
舉報