【问题标题】:Xamarin.iOS Draw a Border for bottom of the UITextField / ViewDidAppear is too lateXamarin.iOS 为 UITextField / ViewDidAppear 底部绘制边框为时已晚
【发布时间】:2017-10-26 08:59:10
【问题描述】:

我在 Xamarin.iOs 中编码,我想为 UITextField 的底部添加一个边框。

所以这很简单,我用谷歌搜索了它并且(我将它个性化到 Xamarin.ios 并且)我有来自这个 link. 的这段代码

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中,BUT太迟了,这意味着当我运行ViewController时,它显示的textField没有边框,并且在几毫秒后就会出现边框,太棒了对我来说晚了。

对这个显示问题有什么想法吗?

编辑:

所以我更详细地问我的问题:

这是我的完整代码:

公共类 ChangePasswordViewController: UIViewController { //私有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 中,它会以几毫秒的延迟完美显示(在显示我的页面内容之后!!!)。你有什么解决办法吗?

【问题讨论】:

    标签: iphone xamarin.ios uitextfield border viewdidappear


    【解决方案1】:

    这是使用Cirrious.FluentLayouts引起的。

    当我们在ViewDidLoad 中设置约束时,这些控件不会在ViewDidAppear 之前完成渲染。

    打印ViewDidLoadViewWillAppearViewDidAppear中那些文本域的边框,你会发现只有ViewDidAppear的边框不相等(0,0,0,0)。

    为了解决问题,可以在ViewDidLoad中添加View.LayoutIfNeeded来强制更新视图。

    View.AddConstraints(
        //xxx
    );
    
    View.LayoutIfNeeded(); //Add this 
    
    _newPasswordTextField  = SetBottomBorderLine(_newPasswordTextField);
    _confirmPasswordTextField  = SetBottomBorderLine(_confirmPasswordTextField);
    _oldPasswordTextField  = SetBottomBorderLine(_oldPasswordTextField);
    

    【讨论】:

    • 我在我的问题中添加了更多细节
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多