[iOS] Add ability to turn off updates to native controls from another thread (#3774)

* [iOS] Add ability to turn off updates to native controls from another thread

* Flip evaluation order

fixes #1755
This commit is contained in:
Samantha Houts 2018-10-04 14:58:34 -07:00 коммит произвёл GitHub
Родитель 07482a10f7
Коммит e1cba2c8f1
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
2 изменённых файлов: 34 добавлений и 8 удалений

Просмотреть файл

@ -4,6 +4,7 @@
public static class Application
{
#region PanGestureRecognizerShouldRecognizeSimultaneously
public static readonly BindableProperty PanGestureRecognizerShouldRecognizeSimultaneouslyProperty = BindableProperty.Create("PanGestureRecognizerShouldRecognizeSimultaneously", typeof(bool), typeof(Application), false);
public static bool GetPanGestureRecognizerShouldRecognizeSimultaneously(BindableObject element)
@ -26,5 +27,31 @@
SetPanGestureRecognizerShouldRecognizeSimultaneously(config.Element, value);
return config;
}
#endregion
#region HandleControlUpdatesOnMainThread
public static readonly BindableProperty HandleControlUpdatesOnMainThreadProperty = BindableProperty.Create("HandleControlUpdatesOnMainThread", typeof(bool), typeof(Application), false);
public static bool GetHandleControlUpdatesOnMainThread(BindableObject element)
{
return (bool)element.GetValue(HandleControlUpdatesOnMainThreadProperty);
}
public static void SetHandleControlUpdatesOnMainThread(BindableObject element, bool value)
{
element.SetValue(HandleControlUpdatesOnMainThreadProperty, value);
}
public static bool GetHandleControlUpdatesOnMainThread(this IPlatformElementConfiguration<iOS, FormsElement> config)
{
return GetHandleControlUpdatesOnMainThread(config.Element);
}
public static IPlatformElementConfiguration<iOS, FormsElement> SetHandleControlUpdatesOnMainThread(this IPlatformElementConfiguration<iOS, FormsElement> config, bool value)
{
SetHandleControlUpdatesOnMainThread(config.Element, value);
return config;
}
#endregion
}
}

Просмотреть файл

@ -5,6 +5,7 @@ using System.Threading;
using CoreAnimation;
using Xamarin.Forms.Internals;
#if __MOBILE__
using Xamarin.Forms.PlatformConfiguration.iOSSpecific;
namespace Xamarin.Forms.Platform.iOS
#else
@ -32,14 +33,12 @@ namespace Xamarin.Forms.Platform.MacOS
public VisualElementTracker(IVisualElementRenderer renderer)
{
if (renderer == null)
throw new ArgumentNullException("renderer");
Renderer = renderer ?? throw new ArgumentNullException("renderer");
_propertyChangedHandler = HandlePropertyChanged;
_sizeChangedEventHandler = HandleSizeChanged;
_batchCommittedHandler = HandleRedrawNeeded;
Renderer = renderer;
renderer.ElementChanged += OnRendererElementChanged;
SetElement(null, renderer.Element);
}
@ -143,9 +142,9 @@ namespace Xamarin.Forms.Platform.MacOS
#if !__MOBILE__
var viewParent = view.RealParent as VisualElement;
var parentBoundsChanged = _lastParentBounds != (viewParent == null ? Rectangle.Zero : viewParent.Bounds);
#else
var thread = !boundsChanged && !caLayer.Frame.IsEmpty && Application.Current?.OnThisPlatform()?.GetHandleControlUpdatesOnMainThread() == false;
#endif
var thread = !boundsChanged && !caLayer.Frame.IsEmpty;
var anchorX = (float)view.AnchorX;
var anchorY = (float)view.AnchorY;
var translationX = (float)view.TranslationX;
@ -165,7 +164,7 @@ namespace Xamarin.Forms.Platform.MacOS
var updateTarget = Interlocked.Increment(ref _updateCount);
Action update = () =>
void update()
{
if (updateTarget != _updateCount)
return;
@ -262,7 +261,7 @@ namespace Xamarin.Forms.Platform.MacOS
transform = transform.Rotate(rotation * (float)Math.PI / 180.0f, 0.0f, 0.0f, 1.0f);
caLayer.Transform = transform;
};
}
#if __MOBILE__
if (thread)
@ -324,4 +323,4 @@ namespace Xamarin.Forms.Platform.MacOS
Performance.Stop(reference);
}
}
}
}