ios - El accesorio UITableViewCell es demasiado ancho en iPad




xamarin (2)

Tengo un problema con la apariencia de mi UITableViewCell en el iPad. Este problema surgió en algún momento entre iOS 7 y ahora, pero no estoy seguro de cuándo comenzó. En un iPod o iPhone, mis celdas se ven bien (vertical u horizontal), pero en el iPad, el accesorio de divulgación es muy amplio. Puedes ver un ejemplo en la imagen de abajo. El mantel tiene un borde verde y la vista de contenido tiene un borde marrón. La vista de contenido es mucho más pequeña de lo que debería ser. Las celdas de la mesa sin el accesorio de divulgación se ven bien.

Estoy usando Xamarin y estoy creando esta IU completamente en código. Aquí está el código (omití el código que establece el interior de las celdas ContentView ya que no es relevante:

protected void Draw()
    {
        Accessory = UITableViewCellAccessory.DisclosureIndicator;

        Layer.BorderColor = UIColor.Green.CGColor;
        Layer.BorderWidth = 1f;

        Frame = new CGRect(0, 0, 320, 42);
        ContentMode = UIViewContentMode.ScaleToFill;
        AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

        ContentView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;
        ContentView.MultipleTouchEnabled = true;
        ContentView.ContentMode = UIViewContentMode.Center;
        ContentView.ClipsToBounds = true;
        ContentView.Layer.BorderColor = UIColor.Brown.CGColor;
        ContentView.Layer.BorderWidth = 1f;

    }

Intenté cambiar el tamaño de ContentView anulando el método LayoutSubviews de la celda. Sin embargo, el ContentView ahora era tan ancho como la tabla, pero el accesorio de divulgación no cambió y ahora estaba debajo del ContentView.

public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        //ContentView.Frame = new CGRect(0, 0, Frame.Size.Width, ContentView.Frame.Size.Height);
    }

Nuevamente, esto no es un problema en absoluto en el iPhone o iPod. No entiendo qué debo hacer para que el iPad funcione correctamente.

Gracias. Zach Green

Editar - 21/10/2015 11:00 Por el momento, he hecho un cambio muy intrincado que está solucionando el problema para mí, pero sé que las futuras actualizaciones de iOS probablemente lo romperán, por lo que preferiría una forma más aprobada por iOS para hacer esto.

public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        //!! - Hack for ipad layout issue with disclosure indicator
        if (Accessory == UITableViewCellAccessory.DisclosureIndicator && UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
        {
            ContentView.Frame = new CGRect(0, 0, Frame.Size.Width - 32, ContentView.Frame.Size.Height);

            foreach (var view in Subviews.OfType<UIButton>())
            {
                view.Frame = new CGRect(Frame.Size.Width - 24, view.Frame.Y, 8, view.Frame.Height);
            }
        }
    }

Esto se debe a los nuevos márgenes de contenido legible de Apple en iOS9 destinados a hacer que el contenido sea más legible en vistas más amplias (iPad Pro).

Puedes desactivar esta función configurando

tableView.cellLayoutMarginsFollowReadableWidth = false

en viewDidLoad


Prueba este código:

    protected void Draw()
        {
            Accessory = UITableViewCellAccessory.DisclosureIndicator;

            Layer.BorderColor = UIColor.Green.CGColor;
            Layer.BorderWidth = 1f;

            Frame = new CGRect(0, 0, [UIApplication sharedApplication].keywindow.frame.size.width, 42);
            ContentMode = UIViewContentMode.ScaleToFill;
            AutoresizingMask = UIViewAutoresizing.FlexibleHeight | UIViewAutoresizing.FlexibleWidth;

            ContentView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;
            ContentView.MultipleTouchEnabled = true;
            ContentView.ContentMode = UIViewContentMode.Center;
            ContentView.ClipsToBounds = true;
            ContentView.Layer.BorderColor = UIColor.Brown.CGColor;
            ContentView.Layer.BorderWidth = 1f;

        }

public override void LayoutSubviews()
    {
        base.LayoutSubviews();
        //!! - Hack for ipad layout issue with disclosure indicator
        if (Accessory == UITableViewCellAccessory.DisclosureIndicator && UIDevice.CurrentDevice.UserInterfaceIdiom == UIUserInterfaceIdiom.Pad)
        {
            ContentView.Frame = new CGRect(0, 0, [UIApplication sharedApplication].keywindow.frame.size.width - 32, ContentView.Frame.Size.Height);

            foreach (var view in Subviews.OfType<UIButton>())
            {
                view.Frame = new CGRect([UIApplication sharedApplication].keywindow.frame.size.width - 24, view.Frame.Y, 8, view.Frame.Height);
            }
        }
    }




xamarin