-
Notifications
You must be signed in to change notification settings - Fork 1
/
MyWrappingView.cs
102 lines (78 loc) · 1.95 KB
/
MyWrappingView.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
namespace MyWrappingView
{
using System;
using System.Linq;
using CoreGraphics;
using Foundation;
using UIKit;
[Register("MyWrappingView")]
public class MyWrappingView : UIView
{
float _preferredMaxLayoutWidth;
public MyWrappingView(IntPtr handle) : base(handle)
{
Initialize();
}
public MyWrappingView(CGRect frame) : base(frame)
{
Initialize();
}
public override CGSize IntrinsicContentSize
{
get
{
if (!Subviews.Any())
return CGSize.Empty;
var totalRect = CGRect.Empty;
EnumerateItemRectsForLayoutWidth(_preferredMaxLayoutWidth,
itemRect => totalRect = CGRect.Union(itemRect, totalRect));
return totalRect.Size;
}
}
public float HorizontalSpacing { get; set; }
public float VerticalSpacing { get; set; }
public override void LayoutSubviews()
{
base.LayoutSubviews();
// Disable animation during rotation, for example
var wereEnabled = UIView.AnimationsEnabled;
UIView.AnimationsEnabled = false;
var enumerator = Subviews.GetEnumerator();
EnumerateItemRectsForLayoutWidth((float)Bounds.Size.Width,
itemRect =>
{
if (enumerator.MoveNext())
(enumerator.Current as UIView).Frame = itemRect;
});
UIView.AnimationsEnabled = wereEnabled;
}
public void SetPreferredMaxLayoutWidth(float width)
{
if (_preferredMaxLayoutWidth.Equals(width))
return;
_preferredMaxLayoutWidth = width;
InvalidateIntrinsicContentSize();
}
void Initialize()
{
HorizontalSpacing = 0;
VerticalSpacing = 0;
}
void EnumerateItemRectsForLayoutWidth(float layoutWidth, Action<CGRect> block)
{
float x = 0, y = 0;
foreach (var view in Subviews)
{
var width = (float)view.Frame.Width;
var height = (float)view.Frame.Height;
if (x > layoutWidth - width)
{
y += height + VerticalSpacing;
x = 0;
}
block(new CGRect(x, y, width, height));
x += width + HorizontalSpacing;
}
}
}
}