[BUG/iOS] Fixed CollectionView Insets ItemSpacing (#7158)
authorGerald Versluis <gerald.versluis@microsoft.com>
Thu, 26 Sep 2019 17:23:41 +0000 (10:23 -0700)
committerRui Marinho <me@ruimarinho.net>
Thu, 26 Sep 2019 17:23:41 +0000 (18:23 +0100)
* Fix 7035

* Update Xamarin.Forms.Controls.Issues.Shared.projitems

* Update ItemsViewLayout.cs

* Update test case to show span issue

* Update AppDelegate.cs

Remove test setting

* Update Xamarin.Forms.Controls.Issues.Shared.projitems

* Update Issue7035.xaml

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.iOS/CollectionView/GridViewLayout.cs
Xamarin.Forms.Platform.iOS/CollectionView/ItemsViewLayout.cs

diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml
new file mode 100644 (file)
index 0000000..c7d8928
--- /dev/null
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
+             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+             x:Class="Xamarin.Forms.Controls.Issues.Issue7035">
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="300"/>
+            <RowDefinition Height="400"/>
+        </Grid.RowDefinitions>
+        <BoxView BackgroundColor="Red" WidthRequest="400" HeightRequest="300" HorizontalOptions="CenterAndExpand" VerticalOptions="CenterAndExpand"/>
+    <CarouselView
+        x:Name="CV"
+        HeightRequest="225"
+        HorizontalOptions="Center" 
+        VerticalOptions="CenterAndExpand" 
+        Margin="15,10,0,20">
+        <CarouselView.ItemsLayout>
+            <LinearItemsLayout
+                Orientation="Horizontal"
+                ItemSpacing="25" />
+        </CarouselView.ItemsLayout>
+        <CarouselView.ItemTemplate>
+            <DataTemplate>
+                <Frame
+                    Padding="0"
+                    Margin="0"
+                    HeightRequest="200"
+                    WidthRequest="300"
+                    BorderColor="LightGray"
+                    CornerRadius="10"
+                    HasShadow="False"
+                    IsClippedToBounds="True">
+                    <Grid
+                        ColumnSpacing="0"
+                        RowSpacing="0">
+                        <Grid.RowDefinitions>
+                            <RowDefinition Height="70*" />
+                            <RowDefinition Height="15*" />
+                            <RowDefinition Height="15*" />
+                        </Grid.RowDefinitions>
+                        <Image
+                            Grid.Row="0"
+                            Aspect="Fill"
+                            Source="xamarinlogo" />
+                        <Label
+                            Grid.Row="1"
+                            Margin="20,0,0,0"
+                            FontSize="Medium"
+                            Text="SUB"
+                            HorizontalOptions="Start"
+                            VerticalOptions="End" />
+                        <Label
+                            Grid.Row="2"
+                            Margin="20,0,0,0"
+                            FontSize="Large"
+                            Text="TITLE"
+                            HorizontalOptions="Start"
+                            VerticalOptions="Start" />
+                        <Image
+                            Margin="0,0,8,0"
+                            Grid.Row="1"
+                            Grid.RowSpan="2"
+                            HorizontalOptions="End"
+                            Aspect="AspectFit"
+                            Source="xamarinlogo" />
+                    </Grid>
+                </Frame>
+            </DataTemplate>
+        </CarouselView.ItemTemplate>
+    </CarouselView>
+
+
+    <CarouselView
+        Grid.Row="1"
+        x:Name="CV2"
+        HeightRequest="225"
+        Margin="15,10,0,20">
+            <CarouselView.ItemsLayout>
+                <LinearItemsLayout
+                Orientation="Horizontal"
+                ItemSpacing="25" />
+            </CarouselView.ItemsLayout>
+            <CarouselView.ItemTemplate>
+                <DataTemplate>
+                    <Frame
+                    Padding="0"
+                    Margin="0"
+                    HeightRequest="200"
+                    WidthRequest="300"
+                    BorderColor="LightGray"
+                    CornerRadius="10"
+                    HasShadow="False"
+                    IsClippedToBounds="True">
+                        <Grid
+                        ColumnSpacing="0"
+                        RowSpacing="0">
+                            <Grid.RowDefinitions>
+                                <RowDefinition Height="70*" />
+                                <RowDefinition Height="15*" />
+                                <RowDefinition Height="15*" />
+                            </Grid.RowDefinitions>
+                            <Image
+                            Grid.Row="0"
+                            Aspect="Fill"
+                            Source="xamarinlogo" />
+                            <Label
+                            Grid.Row="1"
+                            Margin="20,0,0,0"
+                            FontSize="Medium"
+                            Text="SUB"
+                            HorizontalOptions="Start"
+                            VerticalOptions="End" />
+                            <Label
+                            Grid.Row="2"
+                            Margin="20,0,0,0"
+                            FontSize="Large"
+                            Text="TITLE"
+                            HorizontalOptions="Start"
+                            VerticalOptions="Start" />
+                            <Image
+                            Margin="0,0,8,0"
+                            Grid.Row="1"
+                            Grid.RowSpan="2"
+                            HorizontalOptions="End"
+                            Aspect="AspectFit"
+                            Source="xamarinlogo" />
+                        </Grid>
+                    </Frame>
+                </DataTemplate>
+            </CarouselView.ItemTemplate>
+        </CarouselView>
+
+    </Grid>
+</ContentPage>
\ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue7035.xaml.cs
new file mode 100644 (file)
index 0000000..c09e604
--- /dev/null
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+using Xamarin.Forms;
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+using Xamarin.Forms.Xaml;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+#if APP
+       [Preserve(AllMembers = true)]
+       [Issue(IssueTracker.Github, 7035, "[Bug][iOS] CarouselView last element is clipped", 
+               PlatformAffected.iOS)]
+       [XamlCompilation(XamlCompilationOptions.Compile)]
+       public partial class Issue7035 : ContentPage
+       {
+        List<AdItem> announcements = new List<AdItem>();
+
+               public Issue7035()
+               {
+                       InitializeComponent();
+               }
+
+               protected override void OnAppearing()
+        {
+            base.OnAppearing();
+            for (int i = 0; i < 20; i++)
+            {
+                announcements.Add(new AdItem("no_artwork", "Card Title", "SUBHEAD"));
+            }
+            CV.ItemsSource = announcements;
+                       CV2.ItemsSource = announcements;
+               }
+
+       }
+
+       public class AdItem
+    {
+        public string ImgUrl { get; set; }
+        public string Title { get; set; }
+        public string SubTitle { get; set; }
+        public AdItem()
+        {
+
+        }
+        public AdItem(string img, string ttl, string sttl)
+        {
+            ImgUrl = img;
+            Title = ttl;
+            SubTitle = sttl;
+        }
+    }
+#endif
+}
\ No newline at end of file
index b6138858f85a81372a5cd66430d99800e59df58a..db64afd36dc32d1e56da436950c591eaa06e8ded 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)Issue6894.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue6929.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Controls\ApiLabel.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Issue7035.xaml.cs">
+      <DependentUpon>Issue7035.xaml</DependentUpon>
+      <SubType>Code</SubType>
+    </Compile>
     <Compile Include="$(MSBuildThisFileDirectory)Issue7525.xaml.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue7582.cs" />
   </ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue4356.xaml">
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
+    <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7035.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue7525.xaml">
       <Generator>UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="$(MSBuildThisFileDirectory)Github3847.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
+    </EmbeddedResource>
+  </ItemGroup>
   <ItemGroup>
     <EmbeddedResource Include="$(MSBuildThisFileDirectory)Issue4684.xaml">
       <SubType>Designer</SubType>
       <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
     </EmbeddedResource>
   </ItemGroup>
-  <ItemGroup>
-    <EmbeddedResource Include="$(MSBuildThisFileDirectory)Github3847.xaml">
-      <SubType>Designer</SubType>
-      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
-    </EmbeddedResource>
-  </ItemGroup>
   <ItemGroup>
     <Compile Update="$(MSBuildThisFileDirectory)Issue6130.xaml.cs">
       <DependentUpon>Issue6130.xaml</DependentUpon>
index b1f07a959feeb6ab13dd798bd3e046dfedfe7b12..0f16137783d79ef6c42d878dd631a723434a07b9 100644 (file)
@@ -150,6 +150,9 @@ namespace Xamarin.Forms.Platform.iOS
                                return false;
                        }
 
+                       if (CollectionView.NumberOfSections() == 0)
+                               return false;
+
                        var itemCount = CollectionView.NumberOfItemsInSection(section);
 
                        if (itemCount < _itemsLayout.Span)
index ca6957a0f2ec77ace28e7ea78c24834dee2c2c51..c3198e506d11e83440370ba3945cd3f7257da79b 100644 (file)
@@ -88,6 +88,16 @@ namespace Xamarin.Forms.Platform.iOS
                public virtual UIEdgeInsets GetInsetForSection(UICollectionView collectionView, UICollectionViewLayout layout,
                        nint section)
                {
+                       if (_itemsLayout is GridItemsLayout gridItemsLayout)
+                       {
+                               if (ScrollDirection == UICollectionViewScrollDirection.Horizontal)
+                               {
+                                       return new UIEdgeInsets(0, 0, 0, (nfloat)gridItemsLayout.HorizontalItemSpacing * collectionView.NumberOfItemsInSection(section));
+                               }
+
+                               return new UIEdgeInsets(0,0, (nfloat)gridItemsLayout.VerticalItemSpacing * collectionView.NumberOfItemsInSection(section), 0);
+                       }
+
                        return UIEdgeInsets.Zero;
                }