Проблема с рендерером Xamarin Custom Progressbar

Я создал новый пользовательский рендерер, который, кажется, работает, но когда я прокручиваю вверх или вниз, с настройками происходит что-то странное. Как вы можете видеть на фотографиях, размер ProgressBar меняется.

Это происходит только на iOS. На андроиде все нормально. Может быть, кто-то мог бы помочь?

using System;
using Xamarin.Forms.Platform.iOS;
using Xamarin.Forms;
using ExpensesApp.iOS.CustomRenderers;
using CoreGraphics;
using CoreAnimation;
using UIKit;
using System.ComponentModel;
using System.Threading.Tasks;

[assembly: ExportRenderer(typeof(ProgressBar),typeof(CustomProgressBarRenderer))]
namespace ExpensesApp.iOS.CustomRenderers
{
public class CustomProgressBarRenderer : ProgressBarRenderer
{
    public CustomProgressBarRenderer()
    {
        this.ElementChanged += CustomProgressBarRenderer_ElementChanged;
    }

    private void CustomProgressBarRenderer_ElementChanged(object sender, 
    ElementChangedEventArgs<ProgressBar> e)
    {
        setColor(e.NewElement);
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
    {
        base.OnElementChanged(e);
        LayoutSubviews();
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        float x = 1.0f;
        float y = 4.0f;
        CGAffineTransform transform = CGAffineTransform.MakeScale(x, y);
        Transform = transform;
    }

    protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);
        if (e.PropertyName == "Progress")
        {
            setColor(sender as ProgressBar);
        }
    }

    void setColor(ProgressBar element)
    {
        try
        {
            if (element != null)
            {
                var progress = element.Progress * 100;
                if (progress <= 20)
                {
                    this.TintColor = UIColor.Green;
                }
                else if (progress > 20 && progress <= 50)
                {
                    this.TintColor = UIColor.Yellow;
                }
                else if (progress > 50 && progress <= 80)
                {
                    this.TintColor = UIColor.Orange;
                }
                else
                {
                    this.TintColor = UIColor.Red;
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
    }
}
}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
231
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Установите Преобразование в Управление:

public override void LayoutSubviews()
{
    base.LayoutSubviews();
    float x = 1.0f;
    float y = 4.0f;
    CGAffineTransform transform = CGAffineTransform.MakeScale(x, y);
    Control.Transform = transform;
}

И не звоните LayoutSubviews(); в OnElementChanged:

protected override void OnElementChanged(ElementChangedEventArgs<ProgressBar> e)
{
    base.OnElementChanged(e);
    //LayoutSubviews();
}
Ответ принят как подходящий

Спасибо. Я пытался, но это не помогло. Я нашел другое решение. Я не знаю точно, как это происходит. Но работает так, как я хочу. Я все еще учусь :)

 public CustomProgressBarRenderer()
    {
        this.ElementChanged += CustomProgressBarRenderer_ElementChanged;
    }

    private void CustomProgressBarRenderer_ElementChanged(object sender, ElementChangedEventArgs<ProgressBar> e)
    {
        if (e.NewElement != null)
        {
            e.NewElement.ScaleY = 4;
        }
    }

Вы можете пометить этот ответ (нажмите ☑️ в верхнем левом углу этого ответа) позже, что поможет большему количеству людей с такой же проблемой :).

nevermore 30.12.2020 03:25

Другие вопросы по теме