我在Xamarin.iOS项目中使用FluentLayout。我创建了一个视图:
public class SignInView : UIView
{
private const int headerSpacing = 20;
private const int textFieldSpacing = 10;
private const int textFieldButtonSpacing = 15;
private const int buttonSpacing = 10;
private const int textFieldHeight = 50;
public SignInView()
{
ConstructView();
}
private void ConstructView()
{
var signInLabel = new UILabel() { Text = "sign in" };
var usernameTextField = new UITextField() { Placeholder = "enter username" };
var passwordTextField = new UITextField() { Placeholder = "enter password" };
var signInButton = new UIButton();
var createAccountButton = new UIButton();
signInButton.SetTitle("sign in", UIControlState.Normal);
createAccountButton.SetTitle("create account", UIControlState.Normal);
AddSubviews(signInLabel, usernameTextField, passwordTextField, signInButton, createAccountButton);
this.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
this.AddConstraints(
signInLabel.WithSameTop(this),
signInLabel.WithSameCenterX(this),
usernameTextField.Below(signInLabel, headerSpacing),
usernameTextField.WithSameWidth(this),
usernameTextField.Height().GreaterThanOrEqualTo(textFieldHeight),
passwordTextField.Below(usernameTextField, textFieldSpacing),
passwordTextField.WithSameWidth(this),
passwordTextField.Height().GreaterThanOrEqualTo(textFieldHeight),
signInButton.Below(passwordTextField, textFieldButtonSpacing),
signInButton.WithSameWidth(this),
createAccountButton.Below(signInButton, buttonSpacing),
createAccountButton.WithSameWidth(this)
);
BackgroundColor = UIColor.Red;
}
}
当我放置SignInView
在视图中时,我可以正确看到所有内容,但是背景不是红色,因为高度为零,并且由于相同的原因,没有可单击的内容。有没有办法将高度设置SignInView
为的底部createAccountButton
?
顺便问一下,该怎么SubviewsDoNotTranslateAutoresizingMaskIntoConstraints
办?我总是需要它,以便约束起作用,但不知道它到底能做什么。
我想出了一个把戏。我子类化,UIButton
并放置一个事件处理程序以通知约束更新的时间,以便SignInView
可以将其约束更新为适当的高度。
public class ConstraintsButton : UIButton
{
public event EventHandler ConstraintsUpdated;
public override void UpdateConstraints()
{
base.UpdateConstraints();
ConstraintsUpdated?.Invoke(null, EventArgs.Empty);
}
}
public class SignInView : UIView
{
private const int headerSpacing = 20;
private const int textFieldSpacing = 10;
private const int textFieldButtonSpacing = 15;
private const int buttonSpacing = 10;
private const int textFieldHeight = 50;
private const int buttonHeight = 50;
private ConstraintsButton _createAccountButton;
private FluentLayout _heightConstraint;
public SignInView()
{
ConstructView();
}
private void ConstructView()
{
var signInLabel = new UILabel() { Text = "sign in" };
var usernameTextField = new UITextField() { Placeholder = "enter username" };
var passwordTextField = new UITextField() { Placeholder = "enter password" };
var signInButton = new UIButton();
_createAccountButton = new ConstraintsButton();
_createAccountButton.ConstraintsUpdated += CreateAccountButton_ConstraintsUpdated;
signInButton.SetTitle("sign in", UIControlState.Normal);
_createAccountButton.SetTitle("create account", UIControlState.Normal);
AddSubviews(signInLabel, usernameTextField, passwordTextField, signInButton, _createAccountButton);
this.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();
this.AddConstraints(
signInLabel.WithSameTop(this),
signInLabel.WithSameCenterX(this),
usernameTextField.Below(signInLabel, headerSpacing),
usernameTextField.WithSameWidth(this),
usernameTextField.Height().GreaterThanOrEqualTo(textFieldHeight),
passwordTextField.Below(usernameTextField, textFieldSpacing),
passwordTextField.WithSameWidth(this),
passwordTextField.Height().GreaterThanOrEqualTo(textFieldHeight),
signInButton.Below(passwordTextField, textFieldButtonSpacing),
signInButton.WithSameWidth(this),
signInButton.Height().EqualTo(buttonHeight),
_createAccountButton.Below(signInButton, buttonSpacing),
_createAccountButton.WithSameWidth(this),
_createAccountButton.Height().EqualTo(buttonHeight)
);
BackgroundColor = UIColor.Red;
}
private void CreateAccountButton_ConstraintsUpdated(object sender, EventArgs e)
{
if (_heightConstraint != null)
{
this.RemoveConstraints(_heightConstraint);
}
_heightConstraint = this.Height().EqualTo(_createAccountButton.Frame.Bottom);
this.AddConstraints(_heightConstraint);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句