2016-08-08 2 views
1

Я портирую большую базу данных iOS в приложение Xamarin.Forms. У нас есть много пользовательских представлений, которые выполняют свою логику компоновки, делая вычисления в -layoutSubviews. Кодовая база слишком велика для меня во времени, если мне нужно переосмыслить эти вычисления с точки зрения макетов Stack или Grid. То, что я действительно хочу, - это прямой эквивалент, где я могу добавить эквивалентные подзоны к нашим представлениям, не беспокоясь о том, куда они идут, а затем метод, который вызывается, когда изменяются границы представления, внутри которых я могу установить новые границы подсмотров. Затем я могу напрямую перенести наш существующий код iOS.Что такое эквивалент макета Xamarin.Forms layoutSubviews?

Есть ли какой-то эквивалент в Xamarin.Forms для -layoutSubviews?

ответ

1

Вы можете создать свой собственный макет, исходя из класса Xamarin.Forms.Layout.

public class CustomLayout : Layout<View> 
{ 
    public CustomLayout() 
    { 

    } 
} 

Макет должен переопределить метод LayoutChildren. Этот метод отвечает за размещение детей на экране.

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

protected override void LayoutChildren (double x, double y, double width, double height) 
{ 
    for (int i = 0; i < Children.Count; i++) { 
     var child = (View) Children[i]; 
     // skip invisible children 

     if(!child.IsVisible) 
      continue; 
     var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height); 
     var childWidth = childSizeRequest.Request.Width; 
     LayoutChildIntoBoundingRegion (child, new Rectangle (x, y, childWidth, height)); 
     x += childWidth; 
    } 
} 

Этот метод будет автоматически вызываться всякий раз, когда макет должен быть пересчитан. Если ваш макет состоит из жестко закодированных или фиксированных элементов размера, то вместо этого измерьте их размеры в этом алгоритме. Вызовы GetSizeRequest являются одними из самых дорогих вызовов, которые могут быть сделаны и не предсказуемы в их среде исполнения, поскольку поддерево может быть произвольным сложным. Фиксация их размера - отличный способ повысить производительность, если динамический размер не требуется.

Выполнение OnSizeRequest необходимо для правильной установки нового макета при размещении внутри других макетов. Во время циклов компоновки этот метод может быть вызван много раз в зависимости от расположения над ним и количества исправлений макета, необходимых для решения текущей иерархии раскладки.

protected override SizeRequest OnSizeRequest (double widthConstraint, double heightConstraint) 
{ 
    var height = 0; 
    var minHeight = 0; 
    var width = 0; 
    var minWidth = 0; 

    for (int i = 0; i < Children.Count; i++) { 
     var child = (View) Children[i]; 
     // skip invisible children 

     if(!child.IsVisible) 
      continue; 
     var childSizeRequest = child.GetSizeRequest (double.PositiveInfinity, height); 
     height = Math.Max (height, childSizeRequest.Minimum.Height); 
     minHeight = Math.Max (minHeight, childSizeRequest.Minimum.Height); 
     width += childSizeRequest.Request.Width; 
     minWidth += childSizeRequest.Minimum.Width; 
    } 

    return new SizeRequest (new Size (width, height), new Size (minWidth, minHeight)); 
} 

Вы можете прочитать весь учебник о том, как создать пользовательский макет here.

1

Я не уверен, если есть эквивалент в формах для layoutSubviews но расчеты, о которых вы говорите может быть сделано внутри метода под названием:

protected override void OnSizeAllocated(double width, double height) 
{ 
    base.OnSizeAllocated(width, height); 
} 

Вы должны наследовать от ContentPage или любой Страница для переопределения этого метода.

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