Аксессуар UITableViewCell слишком широк на 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 работал правильно.
Благодарю. Зак Грин
Edit - 21.10.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);
}
}
}
3 ответа
Это связано с тем, что в iOS9 появились новые поля для чтения контента в iOS9, предназначенные для того, чтобы сделать контент более читабельным при более широком просмотре (iPad Pro).
Вы можете отключить эту функцию, установив
tableView.cellLayoutMarginsFollowReadableWidth = false
в viewDidLoad
Попробуйте этот код:
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);
}
}
}
Используйте ширину, равную ширине [UIApplication sharedApplication].keyWindow.frame.size.width
вместо жесткого кодирования значений.