Skip to content
This repository has been archived by the owner on May 1, 2024. It is now read-only.

Commit

Permalink
Bug 51536, initial iOS cell layout is incorrect when cell has context…
Browse files Browse the repository at this point in the history
… actions … (#787)

* Bug 51536, initial height is incorrect when cell has context actions or ListView is in recycle mode

* Improved fix for iOS uneven height cell layout

* Fixed indentation and added test case for issue 44525

* Fixed indentation for test case

* Added 1px room, this will fix Bugzilla31330 test, renamed test case to 51536

* Updated shared project file
  • Loading branch information
VitalyKnyazev authored and rmarinho committed Mar 14, 2017
1 parent 2c26d11 commit 2a300b0
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
using System.Linq;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;

namespace Xamarin.Forms.Controls.Issues
{
[Preserve(AllMembers = true)]
[Issue(IssueTracker.Bugzilla, 51536, "[iOS] Xamarin.Forms ListView Row Height Does Not Adapt")]
public class Bugzilla51536 : TestContentPage
{
protected override void Init()
{
const string InstructionsLong = "On iOS, all the list items below will have different height defined by this text, the text " +
"should be wrapped and take all cell space. If this text is not wrapped and there is a lot of " +
"whitespace in the cell then this test has failed. This error was happening to ListView with RecycleElement mode " +
"or when cell has context actions.";

const string InstructionsShort = "On iOS, all the list items below will have different height defined by this text.";

var listItems = Enumerable.Range(1, 100).Select(i => new ItemViewModel
{
Name = "Item" + i,
Description = i % 2 == 0 ? (InstructionsLong + i) : (InstructionsShort + i)
}).ToArray();

var listView = new ListView(ListViewCachingStrategy.RecycleElement)
{
ItemTemplate = new DataTemplate(typeof(ItemViewCell)),
HasUnevenRows = true,
ItemsSource = listItems
};

Content = listView;
}
}

[Preserve(AllMembers = true)]
public sealed class ItemViewModel
{
public string Name { get; set; }
public string Description { get; set; }
}

[Preserve(AllMembers = true)]
public sealed class ItemViewCell : ViewCell
{
public Label Label1 { get; set; }
public Label Label2 { get; set; }

public ItemViewCell()
{
var stackLayout = new StackLayout
{
Orientation = StackOrientation.Vertical,
HorizontalOptions = LayoutOptions.StartAndExpand,
VerticalOptions = LayoutOptions.StartAndExpand
};

Label1 = new Label();
Label2 = new Label { LineBreakMode = LineBreakMode.WordWrap };

stackLayout.Children.Add(Label1);
stackLayout.Children.Add(Label2);

View = stackLayout;
}

protected override void OnBindingContextChanged()
{
base.OnBindingContextChanged();

var item = BindingContext as ItemViewModel;

if (item != null)
{
Label1.Text = item.Name;
Label2.Text = item.Description;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla43663.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla43735.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla44453.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla51536.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla44940.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla44944.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla44166.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla44461.cs" />
Expand Down
3 changes: 2 additions & 1 deletion Xamarin.Forms.Platform.iOS/ContextActionCell.cs
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ public override void LayoutSubviews()
{
base.LayoutSubviews();

if (_scroller == null || (_scroller != null && _scroller.Frame.Width == ContentView.Bounds.Width))
// Leave room for 1px of play because the border is 1 or .5px and must be accounted for.
if (_scroller == null || (_scroller.Frame.Width == ContentView.Bounds.Width && Math.Abs(_scroller.Frame.Height - ContentView.Bounds.Height) < 1))
return;

Update(_tableView, _cell, ContentCell);
Expand Down

0 comments on commit 2a300b0

Please sign in to comment.