Xamarin Forms仅iOS端ListView出现无法移除的空白区域问题求助
Xamarin Forms iOS端ListView顶部多余空白解决方案
这个是iOS平台原生UITableView控件的默认行为导致的,和页面级开启的安全区域适配重复叠加,以及iOS15+新增的列表头部默认padding共同造成了多余空白,可以按以下优先级尝试修复:
- 方案1:修改XAML代码(绝大多数场景可直接解决,无需额外代码)
你当前仅给ListView.Header内部的StackLayout设置了高度,没有显式指定ListView本身的Header高度,同时没有禁用ListView自带的滚动边距自动适配,修改你的ListView标签属性如下:
<ListView BackgroundColor="Yellow" CachingStrategy="RecycleElement" HasUnevenRows="True" ItemSelected="ListView_ItemSelected" ItemsSource="{Binding ListaMensagem}" Scrolled="ListView_Scrolled" SeparatorVisibility="None" <!-- 新增以下两个属性 --> HeaderHeightRequest="{OnPlatform Android=80, iOS=70}" ios:ListView.AdjustsScrollViewInsets="False">
- 方案2:代码端动态适配边距
如果方案1修改后仍有残留空白,先给你的ListView添加名称标识x:Name="MainListView",之后在页面后台构造函数中添加平台专属处理代码:
public MensagemDetailPage() { InitializeComponent(); if (Device.RuntimePlatform == Device.iOS) { MainListView.FooterHeightRequest = 0; } }
- 方案3:兼容iOS15及以上系统的额外头部空白
iOS15以后UITableView新增了SectionHeaderTopPadding属性,默认值约22px,会额外增加顶部空白,可通过自定义渲染器全局处理:
using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(ListView), typeof(CustomListViewRenderer))] namespace YourAppNamespace.iOS.Renderers { public class CustomListViewRenderer : ListViewRenderer { protected override void OnElementChanged(ElementChangedEventArgs<ListView> e) { base.OnElementChanged(e); if (Control != null && UIDevice.CurrentDevice.CheckSystemVersion(15, 0)) { Control.SectionHeaderTopPadding = 0; Control.ContentInset = UIEdgeInsets.Zero; Control.ScrollIndicatorInsets = UIEdgeInsets.Zero; } } } }
内容的提问来源于stack exchange,提问作者Kelvyn Sinhorini
相关产品推荐
相关产品推荐

