summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs')
-rw-r--r--Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs66
1 files changed, 66 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs b/Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs
new file mode 100644
index 00000000..9847867c
--- /dev/null
+++ b/Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs
@@ -0,0 +1,66 @@
+using System.Collections.Generic;
+using System.Drawing;
+using System.Linq;
+using System;
+#if __UNIFIED__
+using UIKit;
+
+#else
+using MonoTouch.UIKit;
+#endif
+
+namespace Xamarin.Forms.Platform.iOS
+{
+ public static class UIViewExtensions
+ {
+ public static IEnumerable<UIView> Descendants(this UIView self)
+ {
+ if (self.Subviews == null)
+ return Enumerable.Empty<UIView>();
+ return self.Subviews.Concat(self.Subviews.SelectMany(s => s.Descendants()));
+ }
+
+ public static SizeRequest GetSizeRequest(this UIView self, double widthConstraint, double heightConstraint, double minimumWidth = -1, double minimumHeight = -1)
+ {
+ var s = self.SizeThatFits(new SizeF((float)widthConstraint, (float)heightConstraint));
+ var request = new Size(s.Width == float.PositiveInfinity ? double.PositiveInfinity : s.Width, s.Height == float.PositiveInfinity ? double.PositiveInfinity : s.Height);
+ var minimum = new Size(minimumWidth < 0 ? request.Width : minimumWidth, minimumHeight < 0 ? request.Height : minimumHeight);
+ return new SizeRequest(request, minimum);
+ }
+
+ internal static T FindDescendantView<T>(this UIView view) where T : UIView
+ {
+ var queue = new Queue<UIView>();
+ queue.Enqueue(view);
+
+ while (queue.Count > 0)
+ {
+ var descendantView = queue.Dequeue();
+
+ var result = descendantView as T;
+ if (result != null)
+ return result;
+
+ for (var i = 0; i < descendantView.Subviews.Length; i++)
+ queue.Enqueue(descendantView.Subviews[i]);
+ }
+
+ return null;
+ }
+
+ internal static UIView FindFirstResponder(this UIView view)
+ {
+ if (view.IsFirstResponder)
+ return view;
+
+ foreach (var subView in view.Subviews)
+ {
+ var firstResponder = subView.FindFirstResponder();
+ if (firstResponder != null)
+ return firstResponder;
+ }
+
+ return null;
+ }
+ }
+} \ No newline at end of file