亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我可以在同一視圖上使用setFrame和autolayout嗎?

我可以在同一視圖上使用setFrame和autolayout嗎?

慕村9548890 2019-11-25 14:13:54
我想向所有按鈕添加填充,因此我將UIButton子類化,在其他更改中,我想使用setFrame方法添加固定的填充。一切正常,除了setFrame。我檢查了一下,發現如果取消選中該視圖上的“ using AutoLayout”,那么我可以使用setFrame,它可以工作。有沒有解決的辦法?我真的想使用自動布局,因為它有助于使該應用在iPhone 5和更早的設備上看起來都不錯。但是我也想在子類中使用setFrame,使我的生活更輕松。總結一下,我的問題是:我可以使用自動布局并以編程方式調整UIView的框架嗎?
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

是的,可以這樣做。


如果設置了視圖的translatesAutoresizingMaskIntoConstraints = YES,則setFrame:在運行時會根據視圖的current將對的調用自動轉換為布局約束autoresizingMask。這使您可以將基于框架的布局與基于約束的布局混合使用。


例如,您可以使用“自動布局”來定義視圖的所有子視圖的布局,但是仍然可以調用setFrame:來設置視圖本身的大小和位置。從您的角度來看,您正在結合使用自動版面設計和直接框架操作來進行版面設計。但是系統實際上是使用約束來處理所有事情。


但是,關于使用存在一個大警告translatesAutoresizingMaskIntoConstraints。


執行此操作時,您仍然需要確保其余約束可以滿足這些自動約束。


因此,例如,假設已經有確定視圖大小和位置的約束,然后還要設置translatesAutoresizingMaskIntoConstraints = YES和調用setFrame:。調用setFrame:將在視圖上生成新的約束,這可能與已經存在的約束沖突。


(實際上,此錯誤經常發生。如果您看到一條日志消息抱怨約束沖突,并且其中一個約束是NSAutoresizingMaskLayoutConstraint,則您看到的是與自動約束沖突。這是一個簡單的錯誤,因為translatesAutoresizingMaskIntoConstraints = YES是默認值,因此,如果您要在代碼中配置約束,則在不需要這些自動約束時,請記住將其關閉。)


相反,再次假設已經存在確定視圖大小和位置的約束,但是translatesAutoresizingMaskIntoConstraints = NO在調用之前先進行設置setFrame:。在這種情況下,您的setFrame:調用不會產生新的約束,因此單獨的約束之間不會發生沖突。但是,在這種情況下,約束和您設置的幀值之間仍然存在“沖突” 。下次調用自動布局時,它將在視圖上看到已經存在的約束,計算它們所需的框架值,并將框架設置為所需的值本身,從而破壞了您手動設置的值。


有關更多詳細信息,請查看Apple的Cocoa自動布局指南中的 “采用自動布局”部分。


查看完整回答
反對 回復 2019-11-25
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

對我來說,最簡單的事情是從其超級視圖中刪除要移動/調整大小的視圖,設置其frame,然后重新添加。例如,UILabel在UITableViewCell子類中采用自定義:


[cell.myLabel removeFromSuperview];

cell.myLabel.frame = someFrameIGenerated;

[cell.contentView addSubview:cell.myLabel];


查看完整回答
反對 回復 2019-11-25
  • 3 回答
  • 0 關注
  • 626 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號