AutoLayoutの制約を動的に変更した話の続き
これだとiOS9.2で意図した通りに動作しなくなったので、
こんな感じに変更してみた。
MainContainerView.swift
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | import UIKit class MainContainerView : UIView { var containerHeightAtDesigned : CGFloat = 0.0 var containerHeightAtUpdate : CGFloat = 0.0 var constantsAtDesigned : [ UIView : CGFloat ] = [:] func initConstraints ( heightAtDesigned : CGFloat ) { containerHeightAtDesigned = heightAtDesigned // memo: デザイン時の高さ //print( "MainContainerView.init, frame: \(self.frame)" ) for c in self . constraints { if let label = c . firstItem as ? UILabel { if c . firstAttribute == . Top { constantsAtDesigned [ label ] = c . constant } } } } override func updateConstraints () { //println( "updateConstraints: \(self.frame)" ) containerHeightAtUpdate = self . frame . height let constraints = self . constraints for var i = 0 ; i < constraints . count ; i ++ { let c = constraints [ i ] if let label = c . firstItem as ? UILabel { if c . firstAttribute == . Top { var val = constantsAtDesigned [ label ]! val = val * ( self . frame . height / containerHeightAtDesigned ) //print( "\(label.text) -> \(c.constant) -> \(val)" ) c . constant = val } } } super . updateConstraints () } override func layoutSubviews () { if containerHeightAtUpdate != self . frame . height { //print( "layoutSubviews: \(self.frame)" ) setNeedsUpdateConstraints () } //print( "layoutSubviews: Here!" ) super . layoutSubviews () } } |
んでもって、viewDidLoad
でこんな感じで呼び出す。
(self.view as! MainContainerView).initConstraints( 487.0 /* from Stroyboard */ )
Storyboardからデザイン時の高さを埋め込まなきゃいけなくて、
こうやって動的に制約を変更するのはもうやらないと誓った次第。
あと、SuperView(親View)の中央にセットして、
multiplierを設定すれば解決できそうだったけど、
上記の方法で解決したので、今回は見送ることにした。
おしまい。
Leave a Comment