自動レイアウトを使用して、UIViewをスーパービューの中央にプログラムで設定するにはどうすればよいですか?
UIButton* viewObj = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[viewObj setTranslatesAutoresizingMaskIntoConstraints:NO];
[viewObj setBackgroundColor:[UIColor greenColor]];
[self.view addSubview:viewObj];
NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterX
multiplier:1.0
constant:0];
[self.view addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeCenterY
multiplier:1.0
constant:0];
[self.view addConstraint:cn];
上記のコードはUIButtonでは機能しますが、最初の行をUIViewで機能するものに置き換えるのに問題があります。
私はもう試した
UIView* viewObj = [UIView alloc] initWithFrame:CGRectZero];
ただし、ビューはシミュレーターに表示されません。
助言がありますか?
ありがとう!
自動レイアウトを使用するコンテキストでこの質問をしたので、ここでの問題は、UIButtonに幅と高さに関する情報を自動レイアウトに提供する固有のサイズ(intelligentContentSizeメソッドを介して伝達される)があることですが、UIViewは通常はそうではありません。したがって、幅と高さに関連する制約をさらに追加する必要があります。
UIViewを設定サイズ(たとえば、200x200)にしたい場合は、次の行を追加できます。
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200];
[viewObj addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200];
[viewObj addConstraint: cn];
toItem:
引数はnil
で、2番目の属性はNSLayoutAttributeNotAnAttribute
です。これは、他のものに対して幅と高さを相対的に指定していないためです。サブビューの高さと幅をスーパービュー(たとえば、0.5)に対して相対的にする場合は、次のようにします。
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeHeight
multiplier:0.5
constant:0];
[self.view addConstraint:cn];
cn = [NSLayoutConstraint constraintWithItem:viewObj
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.view
attribute:NSLayoutAttributeWidth
multiplier:0.5
constant:0];
[self.view addConstraint: cn];
UIButton
、UIImageView
、UIlabel
およびUITextField
は、コンテンツのプロパティに応じてサイズを自動的に設定できます。 UIImageView
の幅と高さは、それに含まれるUIImage
によって設定されます。 UILabel
のサイズは、そのテキストによって異なります。 UIButton
の幅と高さは、タイトルとその画像によって定義されます(詳細は 固有のコンテンツサイズ で確認できます)。
したがって、UIButton
、UILabel
、UITextField
、またはUIImageView
を自動レイアウトでUIView
の中央に配置したい場合は、ほとんどすべての場合、幅と高さの制約を作成する必要はありません。水平方向と垂直方向の制約を設定するだけです。
ただし、自動レイアウトでは、サブビューを持たないUIView
は、任意の幅と高さの制約を指定しない限り、サイズを設定するために何にも依存できません。そして、必要に応じて、これを3つの異なる方法で解決できます。
ここでは、UIView
の幅と高さを自動レイアウト制約として直接設定しています。
_override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView()
newView.backgroundColor = .redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
// Auto layout code using anchors (iOS9+)
let horizontalConstraint = newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor)
let verticalConstraint = newView.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor)
let widthConstraint = newView.widthAnchor.constraintEqualToAnchor(nil, constant: 100)
let heightConstraint = newView.heightAnchor.constraintEqualToAnchor(nil, constant: 100)
NSLayoutConstraint.activateConstraints([horizontalConstraint, verticalConstraint, widthConstraint, heightConstraint])
}
_
ここでは、UIView
を幅と高さで初期化し、その中心とスーパービューの中心を等しくして、いくつかの自動サイズ変更マスクを作成します。次に、これらの自動サイズ変更マスクを自動レイアウト制約に変換するようUIKitに要求します。
_override func viewDidLoad() {
super.viewDidLoad()
let newView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
newView.backgroundColor = .redColor()
newView.center = CGPointMake(view.bounds.midX, view.bounds.midY)
newView.autoresizingMask = [.FlexibleLeftMargin, .FlexibleRightMargin, .FlexibleTopMargin, .FlexibleBottomMargin]
newView.translatesAutoresizingMaskIntoConstraints = true // default is true
view.addSubview(newView)
}
_
ここでは、UIView
のサブクラスを作成し、そのintrinsicContentSize()
メソッド( declaration )をオーバーライドして、目的のサイズを返します。
_import UIKit
class CustomView: UIView {
override func intrinsicContentSize() -> CGSize {
return CGSize(width: 100, height: 100)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let newView = CustomView()
newView.backgroundColor = .redColor()
newView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(newView)
let horizontalConstraint = NSLayoutConstraint(item: newView,
attribute: .CenterX,
relatedBy: .Equal,
toItem: view,
attribute: .CenterX,
multiplier: 1,
constant: 0)
view.addConstraint(horizontalConstraint)
let verticalConstraint = NSLayoutConstraint(item: newView,
attribute: .CenterY,
relatedBy: .Equal,
toItem: view,
attribute: .CenterY,
multiplier: 1,
constant: 0)
view.addConstraint(verticalConstraint)
}
}
_