2017-02-08 3 views
1

Теперь, прежде чем кто-либо проигнорирует это как дубликат, пожалуйста, прочитайте до конца. То, что я хочу, чтобы достичь этоДобавление нижней границы к записи в Xamarin Forms iOS с изображением в конце

What I want to achieve

Я делал некоторые погуглите и глядя на Objective C и быстрые ответы на StackOverflow, а также. И этот ответ StackOverFlowPost, казалось, указывал мне в правильном направлении. Автор даже сказал мне использовать ClipsToBounds, чтобы закрепить подзаголовок и убедиться, что он находится в пределах границ родителей. Теперь вот моя проблема, если я хочу показать изображение с правой стороны записи (поле «Пол»), я не могу, потому что я обрезаю subview.

Для отсечения я устанавливаю свойство IsClippedToBounds = "True" в родительском стеке для всех текстовых полей.

Это код, я использую, чтобы добавить нижнюю границу

 Control.BorderStyle = UITextBorderStyle.None; 
      var myBox = new UIView(new CGRect(0, 40, 1000, 1)) 
      { 
       BackgroundColor = view.BorderColor.ToUIColor(), 
      }; 
      Control.AddSubview(myBox); 

Это код, я использую, чтобы добавить изображение в начале или в конце записи

private void SetImage(ExtendedEntry view) 
{ 
    if (!string.IsNullOrEmpty(view.ImageWithin)) 
    { 
     UIImageView icon = new UIImageView 
     { 
      Image = UIImage.FromFile(view.ImageWithin), 
      Frame = new CGRect(0, -12, view.ImageWidth, view.ImageHeight), 
      ClipsToBounds = true 
     }; 
     switch (view.ImagePos) 
     { 
      case ImagePosition.Left:       
       Control.LeftView.AddSubview(icon); 
       Control.LeftViewMode = UITextFieldViewMode.Always; 
       break; 
      case ImagePosition.Right: 
       Control.RightView.AddSubview(icon); 
       Control.RightViewMode = UITextFieldViewMode.Always; 
       break; 
     } 

    } 
} 

После анализа и отладки я выяснил, что, когда вызывается функция OnElementChanged пользовательского рендерера, элемент управления все еще не нарисован, поэтому он не имеет размера. Так что я подклассы UITextField как этот

public class ExtendedUITextField : UITextField 
    { 
     public UIColor BorderColor; 
     public bool HasBottomBorder; 
     public override void Draw(CGRect rect) 
     { 
      base.Draw(rect); 
      if (HasBottomBorder) 
      { 
       BorderStyle = UITextBorderStyle.None; 
       var myBox = new UIView(new CGRect(0, 40, Frame.Size.Width, 1)) 
       { 
        BackgroundColor = BorderColor 
       }; 
       AddSubview(myBox); 
      } 


     } 

     public void InitInhertedProperties(UITextField baseClassInstance) 
     { 
      TextColor = baseClassInstance.TextColor; 
     } 

    } 

И прошли hasbottomborder и BorderColor параметры как этот

protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) 
     { 
      base.OnElementChanged(e); 

      var view = e.NewElement as ExtendedEntry; 


      if (view != null && Control != null) 
      { 
       if (view.HasBottomBorder) 
       { 
        var native = new ExtendedUITextField 
        { 
         BorderColor = view.BorderColor.ToUIColor(), 
         HasBottomBorder = view.HasBottomBorder 
        }; 
        native.InitInhertedProperties(Control); 
        SetNativeControl(native); 
       } 
} 

Но после того, как делать это, теперь нет событий огня :( Может кто-то пожалуйста, мне точку в правильном направлении Я уже построил это для Android, но мне кажется, что проблема с iOS вызывает проблемы.

ответ

1

Я выяснил, что, когда функция OnElementChanged пользовательского рендеринга вызываемый, элемент управления все еще не нарисован, поэтому он не имеет размера.

В старых версиях Xamarin.Forms и прошивкой 9, получая размер элемента управления в OnElementChanged работал ....

Вам не нужно ExtendedUITextField, чтобы получить размер элемента управления, переопределить Frame в вашем оригинал визуализатора:

public override CGRect Frame 
{ 
    get 
    { 
     return base.Frame; 
    } 
    set 
    { 
     if (value.Width > 0 && value.Height > 0) 
     { 
      // Use the frame size now to update any of your subview/layer sizes, etc... 
     } 
     base.Frame = value; 
    } 
} 
+0

Я должен начать есть те суши, которые вы едите :) –

Смежные вопросы