Ошибка автоматического макета. Невозможно одновременно удовлетворить ограничения с помощью UIScrollView.

У меня есть UIScrollView, который должен показывать UIImageViews. ImageViews программно вставляются во время выполнения в зависимости от того, сколько изображений было сохранено пользователем ранее. Я получаю ошибку ниже:

Невозможно одновременно удовлетворить ограничения.

Вероятно, по крайней мере одно из ограничений в следующем списке вам не нужно. Попробуйте следующее: (1) посмотрите на каждое ограничение и попытайтесь выяснить, чего вы не ожидаете; (2) найти код, который добавил нежелательное ограничение или ограничения, и исправить его. (Примечание. Если вы видите NSAutoresizingMaskLayoutConstraints, которые не понимаете, обратитесь к документации по свойству UIView translatesAutoresizingMaskIntoConstraints.)

"<NSLayoutConstraint:0x17029cd90 H:[UIView:0x15cd31e70]-(0)-|   (Names: '|':UIScrollView:0x15cd326b0 )>",
"<NSLayoutConstraint:0x17029d060 UIScrollView:0x15cd326b0.trailingMargin == UIView:0x15cd31e70.trailing>"

Я делаю базовую вещь Autolayout, когда прокрутка закрепляется со всех четырех сторон в 0 точках. Затем я добавляю contentView в качестве подпредставления (обычный UIView) UIScrollView, который также закреплен со всех четырех сторон в 0 точках.

РЕДАКТИРОВАТЬ изображение ограничений раскадровки

 ограничения раскадровки для UIScrollview установлены на 0 со всех сторон для суперпросмотра с ограничениями Descendent, установленными на 0 для contentView

Я задаю contentView ширину в коде следующим образом:

    CGSize pagesScrollViewSize = self.scrollView.frame.size;

        NSDictionary *views     = @{ @"contentView"       :   self.contentView};

        NSDictionary *metrics   = @{ @"width"           :   @(pagesScrollViewSize.width * self.mutableArray.count) };

        NSArray *constraints;
        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views];
        [self.scrollView addConstraints:constraints];

[self loadVisiblePages];

UIImageViews добавляются таким образом, когда UIImageViews добавляются на основе количества страниц, установленных при переходе к ViewController.

-(void)loadVisiblePages{

        CGRect frame = self.scrollView.bounds;
        frame.origin.x = frame.size.width * self.page;
        frame.origin.y = 0.0f;

        ImageForArchiving *newImageObject = (ImageForArchiving*)self.mutableArray[page];
        UIImage *imageForNewPageView = newImageObject.image;

        UIImageView *newPageView = [[UIImageView alloc] initWithFrame:frame];
        [newPageView setTranslatesAutoresizingMaskIntoConstraints:YES];
         newPageView.contentMode = UIViewContentModeScaleAspectFit;
        newPageView.image = imageForNewPageView;
        [self.scrollView addSubview:newPageView];

        [self.pageViews replaceObjectAtIndex:page withObject:newPageView];
    }
}

Кроме того, когда я прокручиваю UIScrollView, отображаемые изображения хаотично изменяют размер при вращении. Я думаю, что это как раз следствие приведенного выше предупреждения и того, что я еще не выложил UIImageViews. Что означает приведенное выше предупреждение в этом контексте и как его исправить?


person noobsmcgoobs    schedule 23.09.2015    source источник
comment
Какие ограничения вы добавили, чтобы привязать contentView к scrollView?   -  person Ishan Handa    schedule 23.09.2015
comment
ContentView прикреплен к прокрутке со всех 4 сторон в 0. Таким образом, левый из contentView закреплен к левому прокрутке в 0 точках, и то же самое для соответствующих сторон contentView к UIScrollView. Никаких других ограничений между contentView и UIScrollView   -  person noobsmcgoobs    schedule 24.09.2015


Ответы (1)


Кажется, вы прикрепили trailingMargin scrollView к contentView.trailing. Измените scrollView.Trailing Margin на scrollView.Trailing для этого ограничения. Вы можете сделать это в инспекторе действий в раскадровке после выбора ограничения.

В качестве альтернативы снимите все ограничения в вашем contentView. Затем при добавлении ограничений закрепления снова снимите флажок Constrain to margins и установите все константы 0.

И

Измените эту строку в своем коде

NSArray *constraints;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[contentView(width)]-|" options:0 metrics:metrics views:views];
    [self.scrollView addConstraints:constraints];

с этим:

NSArray *constraints;
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView(width)]|" options:0 metrics:metrics views:views];
    [self.scrollView addConstraints:constraints];

Использование @"H:|-[contentView(width)]-|" в визуальном формате означает прикрепление вашего contentView к полям superView и добавление пробела в 8 пунктов между superView и subView. В ограничениях вашей раскадровки вы установили ограничения с задними и передними краями UIScrollView, в то время как в программно добавленном ограничении вы использовали замыкающее поле и ведущее поле (вроде запроса contentView для поддержания 8-точечного заполнения). Отсюда и конфликт.

Проверьте синтаксис Visual Format здесь.

person Ishan Handa    schedule 24.09.2015
comment
Вы видите обновление с показанными ограничениями в раскадровке. Я не уверен насчет конечной маржи, поскольку она, похоже, привязана к супервизору. Может я не правильно понимаю? - person noobsmcgoobs; 24.09.2015
comment
Это scrollView или contentView? Кроме того, вы сняли флажок «Ограничить поля» при закреплении contentView? - person Ishan Handa; 24.09.2015
comment
ScrollView и да, я снял флажок «Ограничить поля» - person noobsmcgoobs; 24.09.2015
comment
Отлично, спасибо. Я принял. Можете ли вы просто добавить объяснение того, что предложенное вами изменение делает для будущих пользователей, которые обнаружат ту же проблему? - person noobsmcgoobs; 24.09.2015