<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


UIScrollViewとAutoLayoutでハマった話

UIScrollViewの中にUIImageViewを一つだけ表示するっていうUIを作ってたんですがね。

表示する画像によって、UIImageViewの大きさをいろいろ変化させたいので、XCode上でConstraintsをあらかじめ設定しておけないので、コードのほうでなんとかしないといけないのです。

当初、

  1. XCode上でUIScrollViewにUIImageViewを貼り付け(自動的に、UIImageViewの大きさがニュニュっと大きくなるよね)
  2. UIImageViewにはConstraints設定なし
  3. UIViewControllerのviewDidLoadでUIImageViewのサイズ設定
    override func viewDidLoad() { (略) imageView.frame.size = CGFrame(x:0, y:0, width: imgWidth, height: imgHeight) (略) }

ってやってたわけです。(あ、気づいた?そう、Swiftです。いいよねSwift)

しかしどーうしてもUIImageViewの大きさが600x600になってしまう。

それはもういろいろ調べて試しました。UIScrollViewとAutoLayout | Professional Programmerとかほうぼうで、

scrollView.setTranslatesAutoresizingMaskIntoConstraints(false)

ってやるのがいいとか見て試してダメだったりとか。

調べる途中で、Visual Format Language for Autolayout - Command Shiftとか見つけて、Visual Formatがかけるようになっちゃったりとか。

しかし解決しない。

で、ふと気づきました。600x600のサイズってのは、これはあきらかにXCodeのStoryboardで設定されてる初期値なわけです。このサイズにするConstraintsが勝手にくっついてるのではないか?

そして、過去の経験から、UIScrollViewは複数のUIViewが重なって構成されているってことを知ってるので、調べるためのコードはこれだ!

for c in imageView.superview!.constraints() { println("constraints : \(c)") }

scrollViewのconstraints()ではなく、imageView.superviewを調べるのがミソです。

で、やっぱり付いてました。サイズを600x600にする制約。

となれば、あとは簡単。ついてる制約をごっそり削除しちゃえばいいのです。

var sv = imageView.superview! sv.removeConstraints(sv.constraints())

これで、あとは自前でVisual Format使ってConstraints設定するもよし、CGFrameで自由なレイアウトにするもよし。よかったよかった。


スポンサーサイト

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。