Как разместить кнопку внутри UITextView справа в Xamarin.iOS и предотвратить прокрутку. (Область кнопок не должна прокручиваться!) - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь разместить кнопку для реализации показать / скрыть пароль в пользовательском UITextView в Xamarin.iOS . Однако я столкнулся с двумя (2) проблемами с дизайном пользовательского интерфейса.

Я использовал этот код, используемый для настройки кнопки «Показать / скрыть пароль», и он отлично работает:

UITextView vUpdatedEntry = (UITextView)Control;
var buttonRect = UIButton.FromType(UIButtonType.Custom);
buttonRect.SetImage(UIImage.FromBundle("show_black_24"), UIControlState.Normal);
buttonRect.TouchUpInside += (object sender, EventArgs e1) => {
    if (vUpdatedEntry.SecureTextEntry)
    {
        vUpdatedEntry.SecureTextEntry = false;
        buttonRect.SetImage(UIImage.FromBundle("hide_black_24"), UIControlState.Normal);
    }
    else
    {
        vUpdatedEntry.SecureTextEntry = true;
        buttonRect.SetImage(UIImage.FromBundle("show_black_24"), UIControlState.Normal);
    }
};

выпуск 1 . Я не могу предотвратить прокрутку кнопки при прокрутке UITextView. Всякий раз, когда происходит прокрутка, это происходит:

Scrolling-issue

В основном кнопка прокручивается вместе с текстом, который не является идеальным. Любые идеи о том, как это исправить, будут очень благодарны.

Issue 2 . Я пытаюсь получить кнопку, которая позволяет пользователю выбирать, хотят ли они, чтобы пароль был видимым или не был на правой стороне UITextView. Я использовал код ниже, чтобы сделать это.

buttonRect.Frame = new CoreGraphics.CGRect(10.0f, 0.0f, 15.0f, 15.0f);
buttonRect.ContentMode = UIViewContentMode.ScaleToFill;
buttonRect.BackgroundColor = UIColor.Orange;

UIView paddingViewRight = new UIView(new System.Drawing.RectangleF(0.0f, 0.0f, 30.0f, 18.0f));
paddingViewRight.BackgroundColor = UIColor.Purple;
paddingViewRight.AddSubview(buttonRect);

buttonRect.TranslatesAutoresizingMaskIntoConstraints = false;
buttonRect.CenterYAnchor.ConstraintEqualTo(paddingViewRight.CenterYAnchor).Active = true;

vUpdatedEntry.TextContainerInset = new UIEdgeInsets(8.0f, 0.0f, 8.0f, paddingViewRight.Frame.Width+5.0f);
vUpdatedEntry.AddSubview(paddingViewRight);

paddingViewRight.TranslatesAutoresizingMaskIntoConstraints = false;
paddingViewRight.TrailingAnchor.ConstraintEqualTo(vUpdatedEntry.LayoutMarginsGuide.TrailingAnchor, 9.0f).Active = true;
paddingViewRight.HeightAnchor.ConstraintEqualTo(vUpdatedEntry.HeightAnchor).Active = true;
paddingViewRight.WidthAnchor.ConstraintEqualTo(buttonRect.WidthAnchor,1.0f, 0.0f).Active = true;

Control.Layer.CornerRadius = 4;
Control.Layer.BorderColor = new CoreGraphics.CGColor(255, 255, 255);
Control.Layer.MasksToBounds = true;
vUpdatedEntry.TextAlignment = UITextAlignment.Left;

, и это дает мне это:

My solution

Это мой желаемый визуальный результат, как это выглядит на изображении ниже, когда цвета фона удалены:

My solution-2

Однако это решение выглядит довольно hacky с большим количеством констант, используемых в местах, где я ожидал бы, что использование свойства привязки AutoLayout должно работать. Я пытался использовать свойство TrailingAnchor с ConstraintEqualTo для достижения этого ( this - это липкость к правой стороне UITextView), но оно продолжало придерживаться левой сторонывместо. Более ценный подход к достижению этой цели будет высоко ценится

1 Ответ

0 голосов
/ 08 октября 2019

С помощью Inspiration от @ JackHua-MSFT (автора комментария к вопросу) я смог выяснить, как исправить Выпуск 1 , который был более насущным вопросом в вопросе, мой код ниже:.

buttonRect.ContentMode = UIViewContentMode.ScaleToFill;

UIView paddingViewRight = new UIView(new System.Drawing.RectangleF(0.0f, 0.0f, 30.0f, 18.0f));
paddingViewRight.AddSubview(buttonRect);

buttonRect.TranslatesAutoresizingMaskIntoConstraints = false;
buttonRect.CenterYAnchor.ConstraintEqualTo(paddingViewRight.CenterYAnchor).Active = true;

vUpdatedEntry.AddSubview(paddingViewRight);

paddingViewRight.TranslatesAutoresizingMaskIntoConstraints = false;
paddingViewRight.TrailingAnchor.ConstraintEqualTo(vUpdatedEntry.LayoutMarginsGuide.TrailingAnchor, 8.0f).Active = true;
paddingViewRight.HeightAnchor.ConstraintEqualTo(vUpdatedEntry.HeightAnchor).Active = true;
paddingViewRight.BottomAnchor.ConstraintEqualTo(vUpdatedEntry.LayoutMarginsGuide.BottomAnchor).Active = true;
paddingViewRight.TopAnchor.ConstraintEqualTo(vUpdatedEntry.LayoutMarginsGuide.TopAnchor, -8.0f).Active = true;
paddingViewRight.WidthAnchor.ConstraintEqualTo(buttonRect.WidthAnchor, 1.0f, 3.0f).Active = true;
vUpdatedEntry.TextContainerInset = new UIEdgeInsets(8.0f, 0.0f, 8.0f, paddingViewRight.Frame.Width + 5.0f);

Control.Layer.CornerRadius = 4;
Control.Layer.BorderColor = new CoreGraphics.CGColor(255, 255, 255);
Control.Layer.MasksToBounds = true;
vUpdatedEntry.TextAlignment = UITextAlignment.Left;

Однако, любые предложения по более чистому решению (особенно то, где мне не нужно использовать постоянные значения с плавающей точкой с LayoutMarginsGuide) , будут оценены. Также приветствуется объяснение разницы между использованием .TopAnchor и .BottomAnchor (которое я пробовал использовать, но не работало) против .LayoutMargins.TopAnchor и .LayoutMargins.BottomAnchor. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...