Пример #1
0
        protected override void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            if (disposing)
            {
                if (_formsCell != null)
                {
                    _formsCell.PropertyChanged -= CellPropertyChanged;
                }

                _heightConstraint?.Dispose();
                _heightConstraint = null;

                IVisualElementRenderer renderer = null;
                if (_rendererRef != null &&
                    _rendererRef.TryGetTarget(out renderer) &&
                    renderer.Element != null)
                {
                    FormsInternals.DisposeModelAndChildrenRenderers(renderer.Element);
                    _rendererRef = null;
                }

                renderer?.Dispose();


                _formsCell = null;
            }

            _disposed = true;

            base.Dispose(disposing);
        }
Пример #2
0
        public virtual void UpdateCell(View cell, UITableView tableView)
        {
            if (_formsCell == cell)
            {
                return;
            }

            if (_formsCell != null)
            {
                _formsCell.PropertyChanged -= CellPropertyChanged;
            }

            _formsCell = cell;
            _formsCell.PropertyChanged += CellPropertyChanged;

            IVisualElementRenderer renderer;

            if (_rendererRef == null ||
                !_rendererRef.TryGetTarget(out renderer))
            {
                renderer = GetNewRenderer();
            }
            else
            {
                if (renderer.Element != null &&
                    renderer == Platform.GetRenderer(renderer.Element))
                {
                    renderer.Element.ClearValue(FormsInternals.RendererProperty);
                }

                Type type            = Xamarin.Forms.Internals.Registrar.Registered.GetHandlerTypeForObject(_formsCell);
                var  reflectableType = renderer as IReflectableType;
                Type rendererType    = reflectableType != null
                                                                                ? reflectableType.GetTypeInfo().AsType()
                                                                                : renderer.GetType();

                if (rendererType == type ||
                    (renderer.GetType() == FormsInternals.DefaultRenderer) && type == null)
                {
                    renderer.SetElement(_formsCell);
                }
                else
                {
                    //when cells are getting reused the element could be already set to another cell
                    //so we should dispose based on the renderer and not the renderer.Element
                    FormsInternals.DisposeRendererAndChildren(renderer);
                    renderer = GetNewRenderer();
                }
            }

            Platform.SetRenderer(_formsCell, renderer);

            double      height = double.PositiveInfinity;
            SizeRequest result = renderer.Element.Measure(tableView.Frame.Width, height, MeasureFlags.IncludeMargins);
            double      finalW = result.Request.Width;

            if (_formsCell.HorizontalOptions.Alignment == LayoutAlignment.Fill)
            {
                finalW = tableView.Frame.Width;
            }

            var finalH = (float)result.Request.Height;

            UpdateNativeCell();

            if (_heightConstraint != null)
            {
                _heightConstraint.Active = false;
                _heightConstraint?.Dispose();
            }

            _heightConstraint          = renderer.NativeView.HeightAnchor.ConstraintEqualTo(finalH);
            _heightConstraint.Priority = 999f;
            _heightConstraint.Active   = true;

            Layout.LayoutChildIntoBoundingRegion(_formsCell, new Rectangle(0, 0, finalW, finalH));

            renderer.NativeView.UpdateConstraintsIfNeeded();
        }