1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
using System;
using UIKit;
using Xamarin.Forms.Internals;
namespace Xamarin.Forms.Platform.iOS
{
public class CellRenderer : IRegisterable
{
static readonly BindableProperty RealCellProperty = BindableProperty.CreateAttached("RealCell", typeof(UITableViewCell), typeof(Cell), null);
EventHandler _onForceUpdateSizeRequested;
public virtual UITableViewCell GetCell(Cell item, UITableViewCell reusableCell, UITableView tv)
{
var tvc = reusableCell as CellTableViewCell ?? new CellTableViewCell(UITableViewCellStyle.Default, item.GetType().FullName);
tvc.Cell = item;
WireUpForceUpdateSizeRequested(item, tvc, tv);
tvc.TextLabel.Text = item.ToString();
UpdateBackground(tvc, item);
return tvc;
}
protected void UpdateBackground(UITableViewCell tableViewCell, Cell cell)
{
if (cell.GetIsGroupHeader<ItemsView<Cell>, Cell>())
{
if (UIDevice.CurrentDevice.CheckSystemVersion(7, 0))
tableViewCell.BackgroundColor = new UIColor(247f / 255f, 247f / 255f, 247f / 255f, 1);
}
else
{
// Must be set to a solid color or blending issues will occur
var bgColor = UIColor.White;
var element = cell.RealParent as VisualElement;
if (element != null)
bgColor = element.BackgroundColor == Color.Default ? bgColor : element.BackgroundColor.ToUIColor();
tableViewCell.BackgroundColor = bgColor;
}
}
protected void WireUpForceUpdateSizeRequested(ICellController cell, UITableViewCell nativeCell, UITableView tableView)
{
cell.ForceUpdateSizeRequested -= _onForceUpdateSizeRequested;
_onForceUpdateSizeRequested = (sender, e) =>
{
var index = tableView?.IndexPathForCell(nativeCell) ?? (sender as Cell)?.GetIndexPath();
if (index != null)
tableView.ReloadRows(new[] { index }, UITableViewRowAnimation.None);
};
cell.ForceUpdateSizeRequested += _onForceUpdateSizeRequested;
}
internal static UITableViewCell GetRealCell(BindableObject cell)
{
return (UITableViewCell)cell.GetValue(RealCellProperty);
}
internal static void SetRealCell(BindableObject cell, UITableViewCell renderer)
{
cell.SetValue(RealCellProperty, renderer);
}
}
}
|