2016-08-23 41 views
0

我有一個標準的UIView通過IB添加,它根據使用約束的方向更改大小。以編程方式,我將一個自定義組件(子類UIView)添加到此視圖,默認情況下是sam大小作爲其父視圖。問題是,如何獲得自定義視圖(以編程方式添加),以便在父級大小更改(由於方向更改)時更新其大小以匹配其父級?AutoLayout調整自定義UIView內容的大小

@IBOutlet weak var cardView: UIView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let frame = cardView.bounds 
    // Custom component sub classes UI View 
    // Should always be same size as its parent 
    let imageTemplateView: ImageTemplateView = ImageTemplateView(frame: frame) 

    cardView.addSubview(imageTemplateView) 
} 
+0

嘗試使用'clipsToBounds' – Gokul

回答

1

這裏談到viewDidLayoutSubviews來解決我們的問題,

說明:

當界限的視圖控制器的看法改變,視圖調整其子視圖的位置,然後系統會調用此方法。

代替viewDidLoad使用viewDidLayoutSubviews如下

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 
    let imageTemplateView: ImageTemplateView = ImageTemplateView(frame: frame) 
    cardView.addSubview(imageTemplateView) 
    imageTemplateView.clipsToBounds = true 
} 

UPDATE:

  • 聲明變量以上viewdidload

    var imageTemplateView: ImageTemplateView = ImageTemplateView() 
    
  • 設定框架,並在viewDidLoad中添加它作爲副視點

    override func viewDidLoad() { 
        imageTemplateView = ImageTemplateView(frame: frame) 
        cardView.addSubview(imageTemplateView) 
        imageTemplateView.clipsToBounds = true 
    } 
    
  • viewDidLayoutSubviews只設置單獨的幀,這樣,每當方向變化ImageTemplateView的框架將被更新

    override func viewDidLayoutSubviews() { 
        super.viewDidLayoutSubviews() 
        imageTemplateView = ImageTemplateView(frame: frame) 
    } 
    
+0

它會繼續添加一個更多的imageTemplateView作爲子視圖時,曾經viewDidLayoutSubviews調用 – raki

+0

感謝@raki答案更新。, – Gokul

+0

這是錯誤的方法。添加任何像imageview或標籤或'viewDidLayoutSubviews'的對象是個好主意,因爲每次調用viewDidLayoutSubviews時它都會添加新對象。如果你的設備的方向改變,那麼這個方法也會被調用。因此,請根據需要在'viewdidload'中添加視圖,並在'viewDidLayoutSubviews'中調整其大小。 – Lion

0

您可以使用尺寸類功能。設置約束並添加視圖底座或方向更改。 檢查本教程 http://www.hossamghareeb.com/size-classes-tutorial/

+0

我在通過IB添加的UIView上使用大小類來根據方向/設備改變其外觀。不知道我會如何編程方式在自定義視圖添加 - 所有這個視圖需要做的是與其父母相同的大小 – MikeJ

1

設置你的編程方式添加視圖的top,bottom,leading and trailing與每個恆定0約束。因此,它將始終與您在IB中添加的父視圖保持相同的大小。如果你想要合理的(如父視圖的一半或其他寬度)heightwidth那麼你可以通過玩constantmultiplier來管理它。

如果您不知道如何以編程方式添加約束,則可以參考This SO post

+0

我認爲使用viewDidLayoutSubviews在這種情況下最簡單,但我可以看到如何以編程方式設置約束是有利於更高的定位精度 - 非常感謝 – MikeJ

+1

不客氣.. !!!在'viewDidLayoutSubviews'中添加新的對象不是好的方法。你應該從'viewdidload'中添加它,它只被調用一次。 – Lion

1

試試這個

@IBOutlet weak var cardView: UIView! 
var imageTemplateView:ImageTemplateView! 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    imageTemplateView = ImageTemplateView(frame: cardView.bounds) 
    cardView.addSubview(imageTemplateView) 
} 

override func viewDidLayoutSubviews() 
{ 
    super.viewDidLayoutSubviews() 
    imageTemplateView.frame = cardView.bounds 
} 
+0

修改過的viewDidLayoutSubviews方法 – raki

+0

這很好! – MikeJ