iOS UIScrollView对应Android OnDraw方法及ScrollViewRenderer相关技术问询
iOS ScrollViewRenderer 替代 Android OnDraw 的实现方案
问题1:替代Draw的正确方式
iOS的Draw(CGRect rect)仅在视图初始化或调用SetNeedsDisplay()时触发,不会随滚动自动调用。你需要监听原生UIScrollView的滚动事件,在滚动时触发重绘:
- 在Renderer的
OnElementChanged方法中,给原生Control(即UIScrollView)绑定滚动事件:
protected override void OnElementChanged(ElementChangedEventArgs<ScrollView> e) { base.OnElementChanged(e); if (Control != null) { Control.Scrolled += OnScrollViewScrolled; } }
- 实现滚动事件处理方法,调用
SetNeedsDisplay()触发重绘:
private void OnScrollViewScrolled(object sender, EventArgs e) { SetNeedsDisplay(); }
这样每次滚动时,Draw(CGRect rect)就会被调用,和Android的OnDraw行为一致。
问题2:获取绘图用的"Canvas"
在iOS的Draw方法中,你可以通过UIGraphics.GetCurrentContext()获取CGContext对象,它就相当于Android的Canvas,支持绘制位图、路径等操作。示例代码:
public override void Draw(CoreGraphics.CGRect rect) { base.Draw(rect); using (var context = UIGraphics.GetCurrentContext()) { // 这里用context执行绘图逻辑,比如绘制位图 var image = UIImage.FromFile("scroll_bitmap.png"); image.Draw(new CGRect(0, Control.ContentOffset.Y, image.Size.Width, image.Size.Height)); } }
问题3:获取当前ScrollY值
iOS原生UIScrollView的ContentOffset.Y属性就是当前的垂直滚动偏移量,对应Android的ScrollY。你可以在Renderer中直接通过Control.ContentOffset.Y获取,比如在滚动事件或Draw方法中使用。
内容的提问来源于stack exchange,提问作者jho
相关产品推荐
相关产品推荐

