自動レイアウトが初めてです。すべてのプロジェクトをxibファイルから実行しましたが、プログラムでビューの高さを更新する必要があるという問題に直面しました。私は以下を試しましたが、現在働いています。
[[self view] addConstraint:[NSLayoutConstraint constraintWithItem:loginContainer attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:loginFrame.size.height]];
コンソールではショーです
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>",
"<NSLayoutConstraint:0x787da210 V:[UIView:0x790cdfb0(400)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x78724530 V:[UIView:0x790cdfb0(170)]>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
新しい制約を追加する代わりに、既存の制約の定数を変更する必要があります。
IBOutletを使用して、Interface Builderの制約に接続します。
@property (nonatomic, weak) NSLayoutConstraint *heightConstraint;
次に、プログラムで設定する必要がある場合は、制約の定数プロパティを設定します。
heightConstraint.constant = 100;
OR
Interface Builderでペン先にアクセスできない場合は、コードで制約を見つけます。
NSLayoutConstraint *heightConstraint;
for (NSLayoutConstraint *constraint in myView.constraints) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
heightConstraint = constraint;
break;
}
}
heightConstraint.constant = 100;
そして、Swiftでは:
if let constraint = (myView.constraints.filter{$0.firstAttribute == .width}.first) {
constraint.constant = 100.0
}
高さの制約の参照を取得するには:制約で+ Ctrlをクリックし、クラスファイルにドラッグアンドドロップします。
制約値を更新するには:
self.heightConstraint.constant = 300;
[self.view updateConstraints];
このSwift拡張機能を使用したより柔軟な方法:
extension UIView {
func updateConstraint(attribute: NSLayoutAttribute, constant: CGFloat) -> Void {
if let constraint = (self.constraints.filter{$0.firstAttribute == attribute}.first) {
constraint.constant = constant
self.layoutIfNeeded()
}
}
}
このビュー拡張を使用して、既存の制約の定数値を更新する方法:
// to update height constant
testView.updateConstraint(attribute: NSLayoutAttribute.height, constant: 20.0)
// to update width constant
testView.updateConstraint(attribute: NSLayoutAttribute.width, constant: 20.0)
ビューをnibViewと呼びましょう。そのため、そのビューをView Controllerにロードしようとしているので、まずView Controllerで、実行中にそれをロードする必要があります。
[[NSBundle mainBundle] loadNibNamed:@"NibView" owner:self options:nil];
次に、nibViewに、自動リサイズマスクを制約に変換する必要がないことを伝える必要があります。
nibView.translatesAutoresizingMaskIntoConstraints = NO;
次に、制約を追加できます
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:nibView
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant:yourValue];
最後に、ビューの制約に追加します。
[self.view addConstraint:heightConstraint];
おそらく幅の制約も追加する必要があるでしょう。
Swift 4.2
自動レイアウトとアニメーションを使用してボタンの高さを増やす
ストーリーボードは使用しません。コード内のすべてのもの。
import UIKit
class AnimateHeightConstraintViewController: UIViewController {
var flowHeightConstraint: NSLayoutConstraint?
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
view.addSubview(button)
button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
button.widthAnchor.constraint(equalToConstant: 100).isActive = true
flowHeightConstraint = button.heightAnchor.constraint(equalToConstant: 30)
flowHeightConstraint?.isActive = true
}
@objc func animateButtonTapped() {
UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
self.flowHeightConstraint?.constant = 100
self.view.layoutIfNeeded()
}, completion: nil)
}
lazy var button: UIButton = {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.backgroundColor = .green
button.addTarget(self, action: #selector(animateButtonTapped), for: .touchUpInside)
return button
}()
}
結果は次のようになります。