Skip to content

Commit

Permalink
fix(scrollviewer): [iOS] Ensure ScrollViewer.ViewportWidth is updated…
Browse files Browse the repository at this point in the history
… correctly

Accounts for asynchronous arrange pass on iOS.
  • Loading branch information
davidjohnoliver committed Feb 3, 2021
1 parent 49d3185 commit 9bcd9d8
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ partial class NativeScrollContentPresenter : UIScrollView, DependencyObject
internal NativeScrollContentPresenter(ScrollViewer scroller) : this()
{
_scrollViewer = new WeakReference<ScrollViewer>(scroller);

// Because the arrange pass is asynchronous on iOS, this is required for the ScrollViewer to get up-to-date viewport dimensions
SizeChanged += (_, __) =>
{
GetParentScrollViewer()?.UpdateDimensionProperties();
};
}

public NativeScrollContentPresenter()
Expand Down Expand Up @@ -61,7 +67,7 @@ private void OnScrolled(object sender, EventArgs e)

private void InvokeOnScroll()
{
var scroller = _scrollViewer.TryGetTarget(out var s) ? s : TemplatedParent as ScrollViewer;
var scroller = GetParentScrollViewer();
if (scroller is null)
{
return;
Expand All @@ -74,6 +80,8 @@ private void InvokeOnScroll()
scroller.OnScrollInternal(clampedOffset.X, clampedOffset.Y, isIntermediate: _isInAnimatedScroll);
}

private ScrollViewer GetParentScrollViewer() => _scrollViewer.TryGetTarget(out var s) ? s : TemplatedParent as ScrollViewer;

// Called when user starts dragging
private void OnDraggingStarted(object sender, EventArgs e)
{
Expand Down
19 changes: 12 additions & 7 deletions src/Uno.UI/UI/Xaml/Controls/ScrollViewer/ScrollViewer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -652,7 +652,12 @@ internal override void OnLayoutUpdated()
UpdateZoomedContentAlignment();
}

private void UpdateDimensionProperties()
#if __IOS__
internal
#else
private
#endif
void UpdateDimensionProperties()
{
if (this.Log().IsEnabled(LogLevel.Debug)
&& (ActualHeight != ViewportHeight || ActualWidth != ViewportWidth)
Expand Down Expand Up @@ -858,7 +863,7 @@ void IFrameworkTemplatePoolAware.OnTemplateRecycled()
}
}

#region Content and TemplatedParent forwarding to the ScrollContentPresenter
#region Content and TemplatedParent forwarding to the ScrollContentPresenter
protected override void OnContentChanged(object oldValue, object newValue)
{
base.OnContentChanged(oldValue, newValue);
Expand Down Expand Up @@ -943,9 +948,9 @@ private void ClearContentTemplatedParent(object oldContent)
provider.Store.ClearValue(provider.Store.TemplatedParentProperty, DependencyPropertyValuePrecedences.Local);
}
}
#endregion
#endregion

#region Managed scroll bars support
#region Managed scroll bars support
private bool _isTemplateApplied;
private ScrollBar? _verticalScrollbar;
private ScrollBar? _horizontalScrollbar;
Expand Down Expand Up @@ -1100,7 +1105,7 @@ private void OnHorizontalScrollBarScrolled(object sender, ScrollEventArgs e)

ChangeViewScroll(e.NewValue, null, disableAnimation: immediate);
}
#endregion
#endregion

// Presenter to Control, i.e. OnPresenterScrolled
internal void OnScrollInternal(double horizontalOffset, double verticalOffset, bool isIntermediate)
Expand Down Expand Up @@ -1214,7 +1219,7 @@ public bool ChangeView(double? horizontalOffset, double? verticalOffset, float?
partial void ChangeViewScroll(double? horizontalOffset, double? verticalOffset, bool disableAnimation);
partial void ChangeViewZoom(float zoomFactor, bool disableAnimation);

#region Scroll indicators visual states (Managed scroll bars only)
#region Scroll indicators visual states (Managed scroll bars only)
private DispatcherQueueTimer? _indicatorResetTimer;
private string? _indicatorState;

Expand Down Expand Up @@ -1293,6 +1298,6 @@ private void HideScrollBarSeparator(object sender, PointerRoutedEventArgs e) //
VisualStateManager.GoToState(this, VisualStates.ScrollBarsSeparator.Collapsed, true);
}
}
#endregion
#endregion
}
}

0 comments on commit 9bcd9d8

Please sign in to comment.