2017-10-26 5 views
1

私はXamarin.iOsでコーディングしていますが、UITextFieldの下に境界線を追加したいと思います。Xamarin.iOS UITextField/ViewDidAppearの下に境界線を描画するのが遅すぎる

だから、私はそれをGoogleで検索してきたし、(私は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を表示し、ちょうど数ミリ秒後に境界が表示されます。

この表示に関する問題はありますか?

EDIT:

だから私はもっと詳細に、私の質問をする:ここ

は私の完全なコードです:

パブリッククラス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またはViewWidAppearまたはViewDidLayoutSubviewsにこれらの行を挿入すると、変更が表示されず、ViewDidAppearに配置すると、(ページのコンテンツを表示した後で)数ミリ秒の遅延で完全に表示されます。私のための解決策はありますか?

答えて

1

Cirrious.FluentLayoutsを使用したことにより発生しました。

ViewDidLoadに制約を設定すると、これらのコントロールはレンダリングを完了しないで、ViewDidAppearになります。

は、(0,0,0,0)、ViewDidLoadでこれらのテキストフィールドの枠を印刷ViewWillAppearViewDidAppear、あなただけのViewDidAppearにフレームが等しくないことを見つけることができます。

この問題を解決するには、ViewDidLoadView.LayoutIfNeededを追加して強制的に表示を更新します。

View.AddConstraints(
    //xxx 
); 

View.LayoutIfNeeded(); //Add this 

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

私は私の更新をチェックし@alirezartbd私の質問 – ali

+0

で詳細を追加しました –

+0

あなたは完璧な男、感謝しています – ali

関連する問題