У меня есть пользовательский UITableViewCell.Странный iOS 8 автоматический макет вопрос
- Изначально некоторые частичные представления и некоторые ограничения автоматической компоновки задаются в представлении содержимого ячейки. Все работает так, как ожидалось.
- Затем я программно меняю (удаляю/добавляю) некоторые подвид и полностью восстанавливаю ограничения (удаляю все, а затем добавляю новые ограничения). После этого UITable, содержащий ячейку, обновляется (высота строки пересчитывается) и setNeedsUpdateContraints, updateConstraintsIfNeeded также явно называются ячейкой.
Полный текст, чтобы воспроизвести проблему. Это на C# (Xamarin), но это легко понять. Here is почти такой же код в Swift.
public class TableViewController : UITableViewController
{
public override void ViewDidLoad()
{
base.ViewDidLoad();
var source = new TableSource(TableView);
var updateButton = new UIBarButtonItem("Update", UIBarButtonItemStyle.Plain, (s, args) => source.DoUpdate());
NavigationItem.RightBarButtonItem = updateButton;
TableView.Source = source;
TableView.ReloadData();
}
}
public class TableSource : UITableViewSource
{
private readonly UITableView _tableView;
private readonly TableCell _cell;
public TableSource(UITableView tableView)
{
_tableView = tableView;
_cell = new TableCell();
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
return _cell;
}
public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
return 55.0f;
}
public override int RowsInSection(UITableView tableview, int section)
{
return 1;
}
public void DoUpdate()
{
_cell.DoUpdate();
_tableView.ReloadData();
}
}
public class TableCell : UITableViewCell
{
private UILabel _label;
public TableCell()
{
DoUpdate();
}
public void DoUpdate()
{
foreach (var subview in ContentView.Subviews)
{
subview.RemoveFromSuperview();
}
_label = new UILabel {Text = "Text here"};
ContentView.Add(_label);
foreach (var subview in ContentView.Subviews)
{
subview.TranslatesAutoresizingMaskIntoConstraints = false;
}
ContentView.RemoveConstraints(ContentView.Constraints);
ContentView.AddConstraints(
new[]
{
NSLayoutConstraint.Create(_label, NSLayoutAttribute.Left, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Left, 1.0f, 15.0f),
NSLayoutConstraint.Create(_label, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, 100.0f),
NSLayoutConstraint.Create(_label, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1.0f, 20.0f),
NSLayoutConstraint.Create(_label, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Bottom, 1.0f, -20.0f)
});
}
}
На старте все работает отлично:
Но после нажатия кнопки Update (сброс подвидов и ограничений):
На IOS 7 ничего не меняется (работает как ожидалось) ,
руководство по эксплуатации iOS 8 не работает должным образом. Похоже, что она теряет некоторые ограничения, определяющие поля между некоторыми из подвидов и просмотра содержимого клеточных границ:
Любые идеи, почему это происходит? Это похоже на ошибку в системе автоматической компоновки iOS.
Вы внедряете метод heightForRowAtIndexPath? Снимок экрана или рисунок были бы хороши, чтобы точно понять проблему макета, с которой вы столкнулись. – Shank
Да, реализуя heightForRowAtIndexPath. Добавлены скриншоты, спасибо. – alexey
Пожалуйста, покажите свой код, который создает ограничения. – matt