iOS 更新到 15 后列表视图顶部出现奇怪的空间

Was*_*sim 7 xamarin.forms

我正在使用\nXamarin.Froms:5.0.0.24125\nXcode 版本:13.0 (13A233)\nVisual Studio for Mac 社区版本 8.10.9(构建 3)\nNuGet 版本:5.9.0.7134\nXamarin.iOS 版本:14.20。 0.27(Visual Studio 社区)

\n

主页.xaml:

\n
<?xml version="1.0" encoding="utf-8" ?>\n<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"\n             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"\n             x:Class="ListViewTopSpace.MainPage"\n             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"\n             Title="Page title"\n             ios:Page.UseSafeArea="true">\n    <ListView ItemsSource="{Binding Users}"\n              BackgroundColor="Blue"\n              HasUnevenRows="True">\n            <ListView.ItemTemplate>\n                <DataTemplate>\n                    <ViewCell>\n                        <StackLayout Margin="0,0,0,0.5"\n                                     Padding="10,0"\n                                     BackgroundColor="AliceBlue">\n                            <Label FontSize="12">\n                                <Label.FormattedText>\n                                    <FormattedString>\n                                        <Span Text="User Id: "\n                                              FontAttributes="Bold"/>\n                                         <Span Text="{Binding Id, Mode=OneWay}"/>\n                                    </FormattedString>\n                                </Label.FormattedText>\n                            </Label>\n                             <Label FontSize="12">\n                                <Label.FormattedText>\n                                    <FormattedString>\n                                        <Span Text="User name: "\n                                              FontAttributes="Bold"/>\n                                         <Span Text="{Binding Name, Mode=OneWay}"/>\n                                    </FormattedString>\n                                </Label.FormattedText>\n                            </Label>\n                        </StackLayout>\n                    </ViewCell>\n                </DataTemplate>\n            </ListView.ItemTemplate>\n        </ListView>\n</ContentPage>\n
Run Code Online (Sandbox Code Playgroud)\n

MainPageViewModel.cs

\n
using System;\nusing System.Collections.ObjectModel;\nusing System.ComponentModel;\n\nnamespace ListViewTopSpace\n{\n  public class MainPageViewModel : ObservableProperty\n  {\n    public MainPageViewModel()\n    {\n     Users = new ObservableCollection<UserListModel>()\n     {\n       new UserListModel { Id = 1, Name = "User 1" },\n       new UserListModel { Id = 2, Name = "Test user 1" },\n       new UserListModel { Id = 3, Name = "User 2" },\n       new UserListModel { Id = 4, Name = "Test user 2" },\n      };\n     }\n\n    private ObservableCollection<UserListModel> _users;\n    public ObservableCollection<UserListModel> Users\n    {\n      get { return _users; }\n      set\n      {\n        _users = value;\n        OnPropertyChanged(nameof(Users));\n      }\n    }\n   }\n\n  public class UserListModel\n  {\n    public int Id { get; set; }\n    public string Name { get; set; }\n  }\n\n  public class ObservableProperty : INotifyPropertyChanged\n  {\n    public event PropertyChangedEventHandler PropertyChanged;\n\n    protected void OnPropertyChanged(string propertyName)\n    {\n      var handler = PropertyChanged;\n      if (handler != null)\n       handler(this, new PropertyChangedEventArgs(propertyName));\n    }\n   }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

结果:\n[1]: https://i.stack.imgur.com/BKn29.png \n这个突出显示的空间不应该存在\xe2\x80\x99。

\n

小智 13

@Colex是对的,但你必须替换这串代码:

Control.TableHeaderView = new UIKit.UIView(frame: new CoreGraphics.CGRect(0, 0, 0, float.MinValue));
Run Code Online (Sandbox Code Playgroud)

有了这个:

Control.SectionHeaderTopPadding = new nfloat(0);
Run Code Online (Sandbox Code Playgroud)

渲染器完整代码:

[assembly: ExportRenderer(typeof(ListView), typeof(LVRenderer))]
namespace YourNameSpace.iOS
{
    public class LVRenderer : ListViewRenderer
    {
        public LVRenderer()
        {
        }

        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
            {
                Control.SectionHeaderTopPadding = new nfloat(0);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Col*_*SFT 3

该问题与苹果有关,而不是 xamarin 方面。

请参阅此线程:https ://developer.apple.com/forums/thread/683980 。

为了解决这个问题,我们可以为 ListView 添加自定义渲染器

尝试下面的代码

[assembly:ExportRenderer(typeof(ListView),typeof(MyRenderer))]
namespace Formssss.iOS
{
    public class MyRenderer : ListViewRenderer
    {
        public MyRenderer()
        {
        }
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);
            if(Control != null)
            {
                Control.TableHeaderView = new UIKit.UIView(frame: new CoreGraphics.CGRect(0, 0, 0, float.MinValue));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)