Xamarin.iOS Нарисуйте границу для нижней части UITextField / ViewDidAppear слишком поздно

Я пишу в Xamarin.iOs, и я хотел бы добавить границу для нижней части UITextField.

Так что все просто, я прогуглил это и (я персонализировал это для Xamarin.ios и) у меня есть этот код по этой ссылке.

UITextField _textField = new UITextField();
_textField.Placeholder = placeHolder;
_textField.AutocapitalizationType = autocap.Value;
_textField.AutocorrectionType = uitextAutocorrect.Value;
_textField.BorderStyle = borderstyle.Value;
_textField.SecureTextEntry = secureTextEntry.Value;
_textField.KeyboardType = uiKeyboardType.Value;
return _textField;

Как вы знаете, я не могу поместить эту часть кода в конструктор моего ViewController, а также в ViewWillAppear. Поэтому я должен поместить его в ViewDidAppear, НО уже слишком поздно, это означает, что когда я запускаю ViewController, он показывает textField без границ, и через несколько миллисекунд граница появится слишком поздно для меня.

Есть идеи для этой проблемы с дисплеем?

РЕДАКТИРОВАТЬ:

Поэтому я задаю свой вопрос гораздо более подробно:

вот мой полный код:

открытый класс ChangePasswordViewController: UIViewController { //private MainViewModel _viewModel;

    private UILabel _oldPasswordLabel;
    private UITextField _oldPasswordTextField;

    private UILabel _newPasswordLabel;
    private UITextField _newPasswordTextField;

    private UILabel _confirmPasswordLabel;
    private UITextField _confirmPasswordTextField;

    private User currentUser;

    private UIButton _saveNewPassworBtn;

    public ChangePasswordViewController(User user)
    {
        currentUser = user;
    }

    private void _saveNewPassworBtn_TouchUpInside(object sender, EventArgs e)
    {
        //do sth
    }


    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        // Perform any additional setup after loading the view, typically from a nib. 

        //_viewModel = new MainViewModel();

        Title = Texts.ChangePassword;
        View.BackgroundColor = UIColor.White;



        _oldPasswordLabel = InitUILabel(Texts.OldPasswordTxt, alignment: UITextAlignment.Right);
        _oldPasswordLabel.Font = UIFont.BoldSystemFontOfSize(14);
        _oldPasswordLabel.AdjustsFontSizeToFitWidth = true;
        _oldPasswordTextField = InitUITextField(Texts.OldPassword, secureTextEntry: true);
        this._oldPasswordTextField.ShouldReturn += (textField) => {
            _newPasswordTextField.BecomeFirstResponder();
            return true;
        };
        _oldPasswordTextField.BorderStyle = UITextBorderStyle.None;




        _newPasswordLabel = InitUILabel(Texts.NewPasswordTxt, alignment: UITextAlignment.Right);
        _newPasswordLabel.Font = UIFont.BoldSystemFontOfSize(14);
        _newPasswordTextField = InitUITextField(Texts.NewPassword, secureTextEntry: true);
        this._newPasswordTextField.ShouldReturn += (textField) => {
            _confirmPasswordTextField.BecomeFirstResponder();
            return true;
        };
        _newPasswordTextField.BorderStyle = UITextBorderStyle.None;



        _confirmPasswordLabel = InitUILabel(Texts.ConfirmPasswordTxt, alignment: UITextAlignment.Right);
        _confirmPasswordLabel.Font = UIFont.BoldSystemFontOfSize(14);
        _confirmPasswordTextField = InitUITextField(Texts.NewPassword, secureTextEntry: true);
        this._confirmPasswordTextField.ShouldReturn += (textField) => {
            textField.ResignFirstResponder();
            return true;
        };
        _confirmPasswordTextField.BorderStyle = UITextBorderStyle.None;





        _saveNewPassworBtn = InitUIButton(Texts.Save, _saveNewPassworBtn_TouchUpInside, Colors.MainColor, UIColor.White);

        View.AddSubviews(_oldPasswordLabel, _oldPasswordTextField, _newPasswordLabel, _newPasswordTextField,
                         _saveNewPassworBtn, _confirmPasswordLabel, _confirmPasswordTextField);

        //

        //constraints
        var hMargin = 10;
        var hMiniMargin = 5;
        var vMargin = 10;


       View.SubviewsDoNotTranslateAutoresizingMaskIntoConstraints();



        View.AddConstraints(
            _oldPasswordLabel.AtTopOf(View, 100),
            _oldPasswordLabel.AtLeftOf(View, hMargin),

            _oldPasswordTextField.Below(_oldPasswordLabel, hMiniMargin),
            _oldPasswordTextField.AtLeftOf(View, hMargin),
            _oldPasswordTextField.WithSameWidth(View).Minus(hMargin * 2),

            _newPasswordLabel.Below(_oldPasswordTextField, vMargin),
            _newPasswordLabel.AtLeftOf(View, hMargin),

            _newPasswordTextField.Below(_newPasswordLabel, hMiniMargin),
            _newPasswordTextField.AtLeftOf(View, hMargin),
            _newPasswordTextField.WithSameWidth(View).Minus(hMargin * 2),

            _confirmPasswordLabel.Below(_newPasswordTextField, vMargin),
            _confirmPasswordLabel.AtLeftOf(View, hMargin),

            _confirmPasswordTextField.Below(_confirmPasswordLabel, hMiniMargin),
            _confirmPasswordTextField.AtLeftOf(View, hMargin),
            _confirmPasswordTextField.WithSameWidth(View).Minus(hMargin * 2),

            _saveNewPassworBtn.Below(_confirmPasswordTextField, vMargin * 3),
            _saveNewPassworBtn.WithSameWidth(View).Minus(20),
            _saveNewPassworBtn.AtLeftOf(View, 10)

        );


        _newPasswordTextField = SetBottomBorderLine(_newPasswordTextField);
        _confirmPasswordTextField = SetBottomBorderLine(_confirmPasswordTextField);
        _oldPasswordTextField = SetBottomBorderLine(_oldPasswordTextField);
    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);

        this.NavigationItem.SetLeftBarButtonItem(new UIBarButtonItem(Texts.Cancel,UIBarButtonItemStyle.Plain, (sender, args) =>
        {
            this.NavigationController.SetNavigationBarHidden(false, false);
            this.NavigationController.PushViewController(new ProfileViewController(), false);
        }), true);

    }
    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);

    }


} 

В этих строках:

_newPasswordTextField = SetBottomBorderLine (_newPasswordTextField); _confirmPasswordTextField = SetBottomBorderLine (_confirmPasswordTextField); _oldPasswordTextField = SetBottomBorderLine (_oldPasswordTextField);

Я поставил границу для моих текстовых полей НО! Если я помещу эти строки в ViewDidLoad или ViewWillAppear или ViewDidLayoutSubviews, они не будут отображать изменения, а если я добавлю их в ViewDidAppear, они будут отображаться с задержкой в ​​несколько миллисекунд (после отображения содержимого моей страницы!!!). У вас есть решение для меня?

1 ответ

Решение

Это вызвано использованием Cirrious.FluentLayouts,

Когда мы устанавливаем ограничения в ViewDidLoadэти элементы управления не завершат рендеринг раньше ViewDidAppear,

Распечатать кадр этих текстовых полей в ViewDidLoad, ViewWillAppear,ViewDidAppear Вы можете найти это только в ViewDidAppear кадр не равен (0,0,0,0).

Чтобы решить проблему, вы можете добавить View.LayoutIfNeeded в ViewDidLoad заставить обновить вид.

View.AddConstraints(
    //xxx
);

View.LayoutIfNeeded(); //Add this 

_newPasswordTextField  = SetBottomBorderLine(_newPasswordTextField);
_confirmPasswordTextField  = SetBottomBorderLine(_confirmPasswordTextField);
_oldPasswordTextField  = SetBottomBorderLine(_oldPasswordTextField);
Другие вопросы по тегам