проблемы ограничений с контейнерами

Хорошо, у меня есть контроллер представления, который находится в контейнере другого представления.

MainView
  View
    Someview
    ContainerView (contains ContainedViewController)
    Otherview

ContainedViewController
   ContainedView (height can get resized during run).
      UILabel (varying height)
      UIView (fixed size, width & height)

Вот в чем дело... размер представления в ContainedViewController должен изменяться во время выполнения. Он содержит метку (которая может увеличиваться в зависимости от текста в ней) и статическое представление непосредственно под ней, которое никогда не меняет размер.

Итак, у меня есть ограничение на высоту UILabel, и я меняю его во время выполнения в зависимости от того, насколько большим он должен быть. Между меткой и фиксированным представлением существует вертикальное ограничение, а также все «стандартные» ограничения для основного суперпредставления.

Однако, когда я запускаю, я получаю «невозможно одновременно удовлетворить ограничения», за которым следует журнал ограничений. Среди конфликтующих ограничений — моя новая высота UILabel, а затем высота ContainedView. Я получаю проблему «UIView-Encapsulated-View-Height» с ContainedView.

По-видимому, высота ContainedView определяется высотой ContainerView MainView.

Я хочу, чтобы высота ContainedView менялась при изменении высоты UILabel, а затем распространяла резервную копию контейнеров вплоть до MainView. Но я не могу заставить это работать.

Как я могу изменить размер суперпредставления и представления контейнера при изменении размера метки?


person Dan Morrow    schedule 18.11.2014    source источник


Ответы (1)


В вашем контроллере основного представления объявите следующее переопределение:

- (void)viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    // Layout the container's content and get its resulting size
    [self.containedViewController.view layoutIfNeeded];
    CGSize containedViewSize = [self.containedViewController contentSize];
    // Now, use containedViewSize to set constraints on the view controller.
    self.containerHeightConstraint.constant = containedViewSize.height;
    self.containerWidthConstraint.constant = containedViewHeight.width;
}

Затем в вашем содержащемся контроллере представления объявите эти свойства:

@property (nonatomic, weak) IBOutlet UIView * contentView;
@property (nonatomic, weak) UIViewController * mainViewController;

В вашей раскадровке сделайте contentView подвидом основного представления содержащегося контроллера представления. Закрепите его с ограничениями в верхнем левом углу основного вида. Поместите любой контент, который вы хотите, в contentView, включая ограничения, определяющие размер contentView. (Однако НЕ прикрепляйте длину и ширину contentView к основному представлению, это вызовет противоречивые ограничения, описанные выше.)

mainViewController должен быть установлен при подготовке к переходу внедрения, который устанавливает контроллер представления контейнера.

И этот метод:

- (CGSize)contentSize {
    return self.contentView.frame.size;
}

Теперь всякий раз, когда вы делаете что-то в контроллере представления контейнера, влияющее на размер contentView, сделайте следующий вызов:

[self.mainViewController.view setNeedsLayout];

Извините, это не проще, но это лучшее решение, которое я нашел для этой проблемы.

person jbelkins    schedule 04.12.2014