2016-11-06 6 views
0

それほど難しいとは言えませんが、試してみたところ、適切な解決策を得ることができませんでした。NSLayoutAnchorを設定して、アスペクト比1:1の中心のサブビューを生成する方法

問題:私はサブビュー(colorImageView)を取得する(クラスNSLayoutAnchor付き)制約を設定したいをbeeingては、1のアスペクト比で、スーパーでを中心に:1、常に最大サイズ可能でスーパービューでは、幅>高さまたは高さ>幅を持つことがあります。

例1:SuperViewSize =幅80、高さ= 100 - >サブビュー80の高さと幅を取得し(40/50)を中心とすべきである

例2:SuperviewSize =幅。 60、height = 50 - > subviewは50の高さと幅を持ち、(30/25)を中心にする必要があります。

私は望みません/問題を解決しない/ハードコードするにはwidthConstraint = min(superviewWidth、superviewHeight )作成の瞬間にサブビュー、スーパービューの境界は最終的に定義されていないので - >私は制約が必要です。

これは、これまでのところ(まだ様々なスーパーの中に可能な最大で高さと幅を設定するには、制約が不足して、私の試みです:

// CREATE CONSTRAINTS(center in SuperView) 
colorImageView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true 
colorImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true 

// CREATE CONSTRAINTS (ratio 1:1) 
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true 

私はそれを行う方法を、ヒントを本当に感謝します。事前に感謝:))

+0

私はスウィフト3構文で答えを更新しました。 – vacawama

答えて

3

は、この作品を作るための鍵は、そのスーパーの幅に等しいが、代わりにデフォルトの1000の750の優先順位()とcolorImageViewの幅を設定することです。

次に、colorImageViewの高さをlessThanOrEqualToに設定してスーパービューの高さを設定します。

自動レイアウトは、この2つの新しい制約を満たすために最善を尽くします。

ビューの幅がその高さよりも大きい場合、colorImageViewの幅をビューの幅と同じにすることはできませんが、優先度は750であるため問題ありません。他の完全優先制約に違反します。

ビューの高さが幅より大きい場合、colorViewの高さはビューの高さであるlessThanOrEqualToであるため、すべての制約を満たすことができます。

import UIKit 

let view = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 100)) 
view.backgroundColor = .red 

let colorImageView = UIView() 
colorImageView.translatesAutoresizingMaskIntoConstraints = false 
colorImageView.backgroundColor = .yellow 

view.addSubview(colorImageView) 

// CREATE CONSTRAINTS(center in SuperView) 
colorImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true 
colorImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true 

// CREATE CONSTRAINTS (ratio 1:1) 
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true 

let widthConstraint = colorImageView.widthAnchor.constraint(equalTo: view.widthAnchor) 
widthConstraint.priority = 750 
widthConstraint.isActive = true 

colorImageView.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor).isActive = true 

view.layoutIfNeeded() 

view.frame = CGRect(x: 0, y: 0, width: 60, height: 50) 
view.layoutIfNeeded() 

ここでは、プレイグラウンドで実行されている:

enter image description here

+0

よろしくお願いします!それはそれを実行させる! – LukeSideWalker

関連する問題