From 17fdde66d94155fc62a034fa6658995bef6fd6e5 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Tue, 22 Mar 2016 13:02:25 -0700 Subject: Initial import --- .../Extensions/UIViewExtensions.cs | 66 ++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs (limited to 'Xamarin.Forms.Platform.iOS/Extensions/UIViewExtensions.cs') 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 Descendants(this UIView self) + { + if (self.Subviews == null) + return Enumerable.Empty(); + 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(this UIView view) where T : UIView + { + var queue = new Queue(); + 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 -- cgit v1.2.3