Подтвердить что ты не робот

UITableViewCell Accessory слишком широк для iPad

У меня возникла проблема с появлением UITableViewCell на iPad. Эта проблема возникла где-то между iOS 7 и теперь, но я не знаю точно, когда она началась. На iPod или iPhone мои камеры выглядят прекрасно (портретный или альбомный), но на iPad, аксессуар раскрытия очень широк. Вы можете увидеть пример на изображении ниже. Столбец имеет зеленую рамку, а контентное изображение имеет коричневую границу. Представление контента намного меньше, чем должно быть. Ячейки таблицы без аксессуара для описания выглядят прекрасно.

Пример

Я использую Xamarin, и я полностью создаю этот интерфейс в коде. Вот код (я пропустил код, излагающий внутри ячеек ContentView, поскольку он не имеет значения:

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;

    }

Я попытался изменить размер ContentView, переопределив метод LayoutSubviews ячейки. Тем не менее, ContentView был теперь столь же широким, как и таблица, но аксессуар раскрытия не изменился и теперь находился ниже ContentView.

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

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

Опять же, это не проблема на iPhone или iPod. Я не понимаю, что я должен делать, чтобы iPad правильно работал.

Спасибо. Зак Грин

Изменить - 10/21/2015 11:00 На данный момент я сделал очень хакерское изменение, которое исправляет проблему для меня, но я знаю, что будущие обновления iOS, вероятно, нарушат это, поэтому я предпочел бы более одобренный IOS способ сделать это.

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);
            }
        }
    }
4b9b3361

Ответ 1

Это связано с тем, что новые читаемые поля содержимого яблок в iOS9 предназначены для того, чтобы сделать контент более читаемым в более широких представлениях (iPad Pro).

Вы можете отключить эту функцию, установив

tableView.cellLayoutMarginsFollowReadableWidth = false

in viewDidLoad

Ответ 2

Попробуйте этот код:

    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);
            }
        }
    }

Ответ 3

Используйте ширину, аналогичную ширине [UIApplication sharedApplication].keyWindow.frame.size.width, а не жесткую кодировку значений.