Xamarin.forms 如何在Xamarin窗体中创建带有淡入边缘的scrollview?(Xamarin.ios)

Xamarin.forms 如何在Xamarin窗体中创建带有淡入边缘的scrollview?(Xamarin.ios),xamarin.forms,xamarin.ios,custom-renderer,Xamarin.forms,Xamarin.ios,Custom Renderer,我已经为scrollview定制了一个渲染器,可以在Xamarin.android上创建淡入淡出的边缘。所以我现在的问题是我的iOS渲染器不工作。 以下是我所拥有的: using System; using CoreAnimation; using CoreGraphics; using Foundation; using Omregistrering.CustomControls; using Omregistrering.iOS.Renderers; using UIKit; usi

我已经为scrollview定制了一个渲染器,可以在Xamarin.android上创建淡入淡出的边缘。所以我现在的问题是我的iOS渲染器不工作。 以下是我所拥有的:

    using System;
using CoreAnimation;
using CoreGraphics;
using Foundation;
using Omregistrering.CustomControls;
using Omregistrering.iOS.Renderers;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer(typeof(FadeScrollView), typeof(FadeScrollViewRenderer))]
namespace Omregistrering.iOS.Renderers
{
   public class FadeScrollViewRenderer : ScrollViewRenderer
   {
       private CAGradientLayer gradientLayer;
       private Double FadePercentage = 0.2;
       private CGColor OpaqueColor = UIColor.Black.CGColor;
       protected override void OnElementChanged(VisualElementChangedEventArgs e)
       {
           base.OnElementChanged(e);
           //UpdateScrollView();
       }
       public override void ScrollRectToVisible(CGRect rect, bool animated)
       {
           base.ScrollRectToVisible(rect, animated);
       }
       private void UpdateScrollView()
       {
           // test with Bounces
           ContentInset = new UIKit.UIEdgeInsets(0, 0, 0, 0);
           if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
               ContentInsetAdjustmentBehavior = UIKit.UIScrollViewContentInsetAdjustmentBehavior.Never;
           Bounces = false;
           ScrollIndicatorInsets = new UIKit.UIEdgeInsets(0, 0, 0, 0);
       }
       private CGColor topOpacity()
       {
           var scrollViewHeight = Frame.Size.Height;
           var scrollContentSizeHeight = ContentSize.Height;
           var scrollOffset = ContentOffset.Y;
           nfloat alpha = (scrollViewHeight >= scrollContentSizeHeight || scrollOffset <= 0) ? 1 : 0;
           var color = new UIColor(white: 0, alpha: alpha);
           return color.CGColor;
       }
       private CGColor bottomOpacity()
       {
           var scrollViewHeight = Frame.Size.Height;
           var scrollContentSizeHeight = ContentSize.Height;
           var scrollOffset = ContentOffset.Y;
           nfloat alpha = (scrollViewHeight >= scrollContentSizeHeight || scrollOffset + scrollViewHeight >= scrollContentSizeHeight) ? 1 : 0;
           var color = new UIColor(white: 0, alpha: alpha);
           return color.CGColor;
       }
       public override void Draw(CGRect rect)
       {
           base.Draw(rect);
           gradientLayer = new CAGradientLayer();
           gradientLayer.Frame = rect;
           var maskLayer = new CALayer();
           gradientLayer.Colors = new CGColor[] { topOpacity(), OpaqueColor, OpaqueColor, bottomOpacity() };
           gradientLayer.Locations = new NSNumber[] { 0, (NSNumber)FadePercentage, (NSNumber)(1 - FadePercentage), 1 };
           maskLayer.AddSublayer(gradientLayer);
           this.Layer.Mask = maskLayer;
       }
   }
}

使用系统;
使用CoreAnimation;
使用核心图形;
使用基础;
使用omRegistering.CustomControls;
使用omRegistering.iOS.renders;
使用UIKit;
使用Xamarin.Forms;
使用Xamarin.Forms.Platform.iOS;
[程序集:ExportRenderer(typeof(FadeScrollView)、typeof(FadeScrollViewRenderer))]
命名空间omregisterering.iOS.Renderers
{
公共类FadeScrollViewRenderer:ScrollViewRenderer
{
私有数据层梯度层;
私人双FadePercentage=0.2;
私有CGColor OpaqueColor=UIColor.Black.CGColor;
受保护的覆盖无效OnElementChanged(VisualElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
//UpdateScrollView();
}
公共覆盖无效ScrollRectToVisible(CGRect rect,布尔动画)
{
base.ScrollRectToVisible(矩形,动画);
}
私有void UpdateScrollView()
{
//反弹测试
ContentInset=新的UIKit.UIEdgeInSet(0,0,0,0);
if(UIDevice.CurrentDevice.CheckSystemVersion(11,0))
ContentInsetAdjustmentBehavior=UIKit.UIScrollViewContentInsetAdjustmentBehavior.Never;
反弹=假;
滚动指示器集=新的UIKit.UIEdgeInsets(0,0,0,0);
}
专用CGColor拓扑容量()
{
var scrollViewHeight=Frame.Size.Height;
var scrollContentSizeHight=ContentSize.Height;
var scrollpoffset=ContentOffset.Y;
nfloat alpha=(scrollViewHeight>=scrollContentSizeHeight | | | scrollOffset=scrollContentSizeHeight | | | scrollOffset+scrollViewHeight>=scrollContentSizeHeight)?1:0;
var color=新UIColor(白色:0,阿尔法:阿尔法);
返回color.CGColor;
}
公共覆盖无效绘制(CGRect rect)
{
基础绘制(rect);
gradientLayer=新的CAGradientLayer();
gradientLayer.Frame=rect;
var maskLayer=new CALayer();
gradientLayer.Colors=new CGColor[]{topocapacity(),OpaqueColor,OpaqueColor,bottomOpacity()};
位置=新的NSNumber[]{0,(NSNumber)FadePercentage,(NSNumber)(1-FadePercentage),1};
maskLayer.AddSublayer(梯度层);
this.Layer.Mask=maskLayer;
}
}
}
结果是:

渲染器在底部边缘淡入淡出,但不会以任何方式更新。当然,ideer在上下滚动时也会有淡入淡出的边缘

这是一个来自Android的截图,我们处于一个滚动的中间,两个边都在衰落,给了更多内容的幻觉。 任何有解决方案或在Xamarin.ios上做过此操作的人


谢谢

我认为您不需要渲染器。 对于每条边,可以使用两个渐变为透明的png。 然后使用
ScrollView.Scrolled
事件,您可以知道是否到达了滚动视图的顶部或底部。 这样,可以根据与边缘的距离设置两个图像的不透明度

在下面的例子中,我们只考虑底部:

private void OnScrolled(object sender, ScrolledEventArgs e)
{
    MyScrollView scrollView = sender as MyScrollView;
    double scrollingSpace = scrollView.ContentSize.Height - scrollView.Height;

    MyBottomImage.Opacity = 1 - e.ScrollY/scrollingSpace;
}

我希望你能明白我的意思:)

嗨,你能给我看一张Android的截图吗?这样我就能清楚地知道想要的效果了。说得好。我用android部分的截图更新了我的问题。淡入淡出的边缘给人更多内容的错觉。谢谢更新问题。是否要将模糊保持在顶部和底部?只有当滚动位置不在结束位置时,才会出现模糊。这意味着,如果scrollview不适合屏幕(内容继续在屏幕下方),则位于顶部的scroll应该不会在顶部模糊,但在底部模糊。底部是相反的。添加的屏幕截图(android)显示了中间位置,屏幕上下都有内容。好的,明白了。如果有解决方案,请在这里分享。