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

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

子類化UIView的正確做法?

子類化UIView的正確做法?

九州編程 2019-12-07 14:00:09
我正在研究一些基于UIView的自定義輸入控件,并且正在嘗試確定用于設置視圖的正確做法。當一個UIViewController的工作,這是相當簡單的使用loadView和相關viewWill,viewDid方法,但是繼承一個UIView的時候,我有最接近methosds是`awakeFromNib,drawRect和layoutSubviews。(我在考慮設置和拆卸回調的問題。)就我而言,我在中設置框架和內部視圖layoutSubviews,但屏幕上看不到任何內容。確保我的視圖具有想要的正確高度和寬度的最佳方法是什么?(盡管可能有兩個答案,但無論是否使用自動版式,我的問題都適用。)什么是正確的“最佳實踐”?
查看完整描述

3 回答

?
SMILET

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

這在Google中仍然很高。以下是swift的更新示例。


該didLoad函數使您可以放置所有自定義的初始化代碼。正如其他人提到的那樣,didLoad當通過編程方式創建視圖init(frame:)或XIB反序列化器通過以下方式將XIB模板合并到您的視圖中時,將被調用init(coder:)


除了:layoutSubviews,updateConstraints大多數視圖被多次調用。當視圖的邊界發生變化時,此功能適用于高級多遍布局和調整。就我個人而言,我盡可能避免使用多遍布局,因為它們會消耗CPU周期并使所有事情變得頭疼。另外,我很少在初始化器中放入約束代碼,因為我很少使它們無效。


import UIKit


class MyView: UIView {

  //-----------------------------------------------------------------------------------------------------

  //Constructors, Initializers, and UIView lifecycle

  //-----------------------------------------------------------------------------------------------------

  override init(frame: CGRect) {

      super.init(frame: frame)

      didLoad()

  }


  required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)

    didLoad()

  }


  convenience init() {

    self.init(frame: CGRectZero)

  }


  func didLoad() {

    //Place your initialization code here


    //I actually create & place constraints in here, instead of in

    //updateConstraints

  }


  override func layoutSubviews() {

     super.layoutSubviews()


     //Custom manually positioning layout goes here (auto-layout pass has already run first pass)

  }


  override func updateConstraints() {

    super.updateConstraints()


    //Disable this if you are adding constraints manually

    //or you're going to have a 'bad time'

    //self.translatesAutoresizingMaskIntoConstraints = false


    //Add custom constraint code here

  }

}


查看完整回答
反對 回復 2019-12-07
?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

Apple 文檔中有一個不錯的摘要,iTunes上提供的免費斯坦福課程對此做了很好的介紹。我在這里介紹我的TL; DR版本:


如果您的類主要由子視圖組成,則在init方法中分配它們的正確位置。對于視圖,有兩種不同的init方法可以調用,這取決于是從代碼還是從筆尖/ storyboard實例化視圖。我要做的是編寫自己的setup方法,然后從initWithFrame:和initWithCoder:方法中調用它。


如果要進行自定義繪圖,則確實要drawRect:在視圖中進行覆蓋。但是,如果自定義視圖主要是子視圖的容器,則可能不需要這樣做。


僅layoutSubViews當您要執行縱向或橫向方向上的添加或刪除子視圖之類的操作時才覆蓋。否則,您應該可以不理會它。


查看完整回答
反對 回復 2019-12-07
  • 3 回答
  • 0 關注
  • 709 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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