diff options
author | adrianknight89 <adrianknight89@outlook.com> | 2017-01-09 04:53:15 -0600 |
---|---|---|
committer | Rui Marinho <me@ruimarinho.net> | 2017-01-09 10:53:15 +0000 |
commit | a0417309b8dce62dacce1a5519d6de47533b8802 (patch) | |
tree | c4d98ed22f030f73c9c4320f61d51a752e5893b5 | |
parent | c8d54e69ce047b97fdc21afcdad68644ccb1be7a (diff) | |
download | xamarin-forms-a0417309b8dce62dacce1a5519d6de47533b8802.tar.gz xamarin-forms-a0417309b8dce62dacce1a5519d6de47533b8802.tar.bz2 xamarin-forms-a0417309b8dce62dacce1a5519d6de47533b8802.zip |
[iOS] Register effects for ScrollView and WebView (#641)
* fix effects
* move effect utilities to core
* use core class
* move to internals namespace
* remove IEffectControlProvider from IVisualElementRenderer
12 files changed, 56 insertions, 25 deletions
diff --git a/Xamarin.Forms.Core/Internals/EffectUtilities.cs b/Xamarin.Forms.Core/Internals/EffectUtilities.cs new file mode 100644 index 00000000..f4fe8323 --- /dev/null +++ b/Xamarin.Forms.Core/Internals/EffectUtilities.cs @@ -0,0 +1,16 @@ +namespace Xamarin.Forms.Internals +{ + internal static class EffectUtilities + { + public static void RegisterEffectControlProvider(IEffectControlProvider self, IElementController oldElement, IElementController newElement) + { + IElementController controller = oldElement; + if (controller != null && controller.EffectControlProvider == self) + controller.EffectControlProvider = null; + + controller = newElement; + if (controller != null) + controller.EffectControlProvider = self; + } + } +}
\ No newline at end of file diff --git a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj index dd01d4b2..9bfb7ba2 100644 --- a/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj +++ b/Xamarin.Forms.Core/Xamarin.Forms.Core.csproj @@ -86,6 +86,7 @@ <Compile Include="DataTemplateSelector.cs" /> <Compile Include="DateChangedEventArgs.cs" /> <Compile Include="DelegateLogListener.cs" /> + <Compile Include="Internals\EffectUtilities.cs" /> <Compile Include="EnumerableExtensions.cs" /> <Compile Include="PlatformConfiguration\AndroidSpecific\AppCompat\Application.cs" /> <Compile Include="PlatformConfiguration\AndroidSpecific\Application.cs" /> @@ -461,4 +462,4 @@ </PostBuildEvent> </PropertyGroup> <ItemGroup /> -</Project> +</Project>
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs index 637ac3bc..f67eb66e 100644 --- a/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.Android/VisualElementRenderer.cs @@ -5,6 +5,7 @@ using System.Collections.Specialized; using System.ComponentModel; using Android.Support.V4.View; using Android.Views; +using Xamarin.Forms.Internals; using AView = Android.Views.View; namespace Xamarin.Forms.Platform.Android @@ -197,13 +198,7 @@ namespace Xamarin.Forms.Platform.Android if (element != null) SendVisualElementInitialized(element, this); - var controller = (IElementController)oldElement; - if (controller != null && controller.EffectControlProvider == this) - controller.EffectControlProvider = null; - - controller = element; - if (controller != null) - controller.EffectControlProvider = this; + EffectUtilities.RegisterEffectControlProvider(this, oldElement, element); if (element != null && !string.IsNullOrEmpty(element.AutomationId)) SetAutomationId(element.AutomationId); diff --git a/Xamarin.Forms.Platform.iOS/Renderers/CarouselPageRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/CarouselPageRenderer.cs index f1364de7..d84dd740 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/CarouselPageRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/CarouselPageRenderer.cs @@ -382,5 +382,10 @@ namespace Xamarin.Forms.Platform.iOS Subviews[0].Frame = new RectangleF(0, 0, (float)Element.Width, (float)Element.Height); } } + + public void RegisterEffect(Effect effect) + { + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs index 55e39ada..6af40216 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/NavigationRenderer.cs @@ -978,9 +978,7 @@ namespace Xamarin.Forms.Platform.iOS void IEffectControlProvider.RegisterEffect(Effect effect) { - var platformEffect = effect as PlatformEffect; - if (platformEffect != null) - platformEffect.Container = View; + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs index e2455d78..1c7730e8 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/PageRenderer.cs @@ -23,9 +23,7 @@ namespace Xamarin.Forms.Platform.iOS void IEffectControlProvider.RegisterEffect(Effect effect) { - var platformEffect = effect as PlatformEffect; - if (platformEffect != null) - platformEffect.Container = View; + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); } public VisualElement Element { get; private set; } diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs index 501312cd..b26e3148 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/PhoneMasterDetailRenderer.cs @@ -401,9 +401,7 @@ namespace Xamarin.Forms.Platform.iOS void IEffectControlProvider.RegisterEffect(Effect effect) { - var platformEffect = effect as PlatformEffect; - if (platformEffect != null) - platformEffect.Container = View; + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/ScrollViewRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/ScrollViewRenderer.cs index 3d38bb6b..c9c24ad6 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/ScrollViewRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/ScrollViewRenderer.cs @@ -6,7 +6,7 @@ using RectangleF = CoreGraphics.CGRect; namespace Xamarin.Forms.Platform.iOS { - public class ScrollViewRenderer : UIScrollView, IVisualElementRenderer + public class ScrollViewRenderer : UIScrollView, IVisualElementRenderer, IEffectControlProvider { EventTracker _events; KeyboardInsetTracker _insetTracker; @@ -88,6 +88,8 @@ namespace Xamarin.Forms.Platform.iOS OnElementChanged(new VisualElementChangedEventArgs(oldElement, element)); + EffectUtilities.RegisterEffectControlProvider(this, oldElement, element); + if (element != null) element.SendViewInitialized(this); @@ -234,5 +236,10 @@ namespace Xamarin.Forms.Platform.iOS if (ScrollView != null) Controller.SetScrolledPosition(ContentOffset.X, ContentOffset.Y); } + + void IEffectControlProvider.RegisterEffect(Effect effect) + { + VisualElementRenderer<VisualElement>.RegisterEffect(effect, this, NativeView); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TabbedRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TabbedRenderer.cs index f0aa7c7f..27492768 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TabbedRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TabbedRenderer.cs @@ -375,9 +375,7 @@ namespace Xamarin.Forms.Platform.iOS void IEffectControlProvider.RegisterEffect(Effect effect) { - var platformEffect = effect as PlatformEffect; - if (platformEffect != null) - platformEffect.Container = View; + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); } void SetTabBarItem(IVisualElementRenderer renderer) diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs index 9f0dff00..fd03d468 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TabletMasterDetailRenderer.cs @@ -388,9 +388,7 @@ namespace Xamarin.Forms.Platform.iOS void IEffectControlProvider.RegisterEffect(Effect effect) { - var platformEffect = effect as PlatformEffect; - if (platformEffect != null) - platformEffect.Container = View; + VisualElementRenderer<VisualElement>.RegisterEffect(effect, View); } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/WebViewRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/WebViewRenderer.cs index 70c9bf60..390e16d2 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/WebViewRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/WebViewRenderer.cs @@ -7,7 +7,7 @@ using Xamarin.Forms.Internals; namespace Xamarin.Forms.Platform.iOS { - public class WebViewRenderer : UIWebView, IVisualElementRenderer, IWebViewDelegate + public class WebViewRenderer : UIWebView, IVisualElementRenderer, IWebViewDelegate, IEffectControlProvider { EventTracker _events; bool _ignoreSourceChanges; @@ -55,6 +55,8 @@ namespace Xamarin.Forms.Platform.iOS OnElementChanged(new VisualElementChangedEventArgs(oldElement, element)); + EffectUtilities.RegisterEffectControlProvider(this, oldElement, element); + if (Element != null && !string.IsNullOrEmpty(Element.AutomationId)) AccessibilityIdentifier = Element.AutomationId; @@ -260,5 +262,10 @@ namespace Xamarin.Forms.Platform.iOS } #endregion + + void IEffectControlProvider.RegisterEffect(Effect effect) + { + VisualElementRenderer<VisualElement>.RegisterEffect(effect, this, NativeView); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/VisualElementRenderer.cs b/Xamarin.Forms.Platform.iOS/VisualElementRenderer.cs index bb971858..155f8b60 100644 --- a/Xamarin.Forms.Platform.iOS/VisualElementRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/VisualElementRenderer.cs @@ -73,6 +73,16 @@ namespace Xamarin.Forms.Platform.iOS } } + public static void RegisterEffect(Effect effect, UIView container, UIView control = null) + { + var platformEffect = effect as PlatformEffect; + if (platformEffect == null) + return; + + platformEffect.Container = container; + platformEffect.Control = control; + } + void IEffectControlProvider.RegisterEffect(Effect effect) { var platformEffect = effect as PlatformEffect; |