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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
using System;
using System.ComponentModel;
using UIKit;
namespace Xamarin.Forms.Platform.iOS
{
public class CellTableViewCell : UITableViewCell, INativeElementView
{
Cell _cell;
public Action<object, PropertyChangedEventArgs> PropertyChanged;
bool _disposed;
public CellTableViewCell(UITableViewCellStyle style, string key) : base(style, key)
{
}
public Cell Cell
{
get { return _cell; }
set
{
if (_cell == value)
return;
ICellController cellController = _cell;
if (cellController != null)
Device.BeginInvokeOnMainThread(cellController.SendDisappearing);
_cell = value;
cellController = value;
if (cellController != null)
Device.BeginInvokeOnMainThread(cellController.SendAppearing);
}
}
public Element Element => Cell;
public void HandlePropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (PropertyChanged != null)
PropertyChanged(this, e);
}
internal static UITableViewCell GetNativeCell(UITableView tableView, Cell cell, bool recycleCells = false, string templateId = "")
{
var id = cell.GetType().FullName;
var renderer = (CellRenderer)Registrar.Registered.GetHandler(cell.GetType());
ContextActionsCell contextCell = null;
UITableViewCell reusableCell = null;
if (cell.HasContextActions || recycleCells)
{
contextCell = (ContextActionsCell)tableView.DequeueReusableCell(ContextActionsCell.Key + templateId);
if (contextCell == null)
{
contextCell = new ContextActionsCell(templateId);
reusableCell = tableView.DequeueReusableCell(id);
}
else
{
contextCell.Close();
reusableCell = contextCell.ContentCell;
if (reusableCell.ReuseIdentifier.ToString() != id)
reusableCell = null;
}
}
else
reusableCell = tableView.DequeueReusableCell(id);
var nativeCell = renderer.GetCell(cell, reusableCell, tableView);
var cellWithContent = nativeCell;
// Sometimes iOS for returns a dequeued cell whose Layer is hidden.
// This prevents it from showing up, so lets turn it back on!
if (cellWithContent.Layer.Hidden)
cellWithContent.Layer.Hidden = false;
if (contextCell != null)
{
contextCell.Update(tableView, cell, nativeCell);
var viewTableCell = contextCell.ContentCell as ViewCellRenderer.ViewTableCell;
if (viewTableCell != null)
viewTableCell.SupressSeparator = tableView.SeparatorStyle == UITableViewCellSeparatorStyle.None;
nativeCell = contextCell;
}
// Because the layer was hidden we need to layout the cell by hand
if (cellWithContent != null)
cellWithContent.LayoutSubviews();
return nativeCell;
}
protected override void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
PropertyChanged = null;
_cell = null;
}
_disposed = true;
base.Dispose(disposing);
}
}
}
|