Как изменить значение свойства 'mutiplier' NSLayoutConstarint в iOS8

Я использую функции адаптивного макета для разработки приложения. Я беру IBOutlet ограничения "Соотношение сторон". Я хочу изменить значение этого значения соотношения сторон на двойное от текущего значения. Проблема в том, что "constraint"свойство может быть легко установлено из кода, но"multiplier"свойство доступно только для чтения. Для изменения соотношения сторон необходимо изменить значение" множителя ". Как я могу это сделать?.

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

В коде

NSLog(@"cell.leftImageWidthAspectRatio:%@ : %lf  %lf",cell.leftImageWidthAspectRatio, cell.leftImageWidthAspectRatio.constant,cell.leftImageWidthAspectRatio.multiplier);

Результаты, которые

 cell.leftImageWidthAspectRatio:<NSLayoutConstraint:0x7c9f2ed0 UIView:0x7c9f2030.width == 2*RIFeedThumbImageView:0x7c9f2c90.width> : 0.000000  2.000000

2 ответа

Решение

Вы правы - изменение множителя для существующего ограничения не поддерживается. constant это исключение, а не правило. Из документов:

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

Что вам нужно сделать, это то, что описано в конце там: заменить существующее ограничение идентичным, но с другим множителем. Примерно так должно работать:

NSLayoutConstraint *oldConstraint = cell.leftImageWidthAspectRatio;
CGFloat newMultiplier = 4; // or whatever
NSLayoutConstraint *newConstraint = [NSLayoutConstraint constraintWithItem:oldConstraint.firstItem attribute:oldConstraint.firstAttribute relatedBy:oldConstraint.relation toItem:oldConstraint.secondItem attribute:oldConstraint.secondAttribute multiplier:newMultiplier constant:oldConstraint.constant];
newConstraint.priority = oldConstraint.priority;
[cell removeConstraint:oldConstraint];
[cell addConstraint:newConstraint];

Обратите внимание, что cell может быть неправильное представление об этом - это зависит от того, где IB решит поместить исходное ограничение. Если это не сработает, покопайтесь в суперпредставлениях ограниченных представлений (вы можете проверить их ограничения с помощью constraints собственность), пока вы не найдете, где это заканчивается.

Простое решение этой проблемы я нахожу таким

  1. Возьмите другое ограничение для ширины
  2. Изменить приоритет для соотношения сторон (меньше, чем приоритет ширины);
  3. Измените значение ограничения ширины с помощью соотношения сторон multipile имущество

@property (nonatomic,weak) IBOutlet NSLayoutConstraint *leftImagewidthConstaint;

@property (retain, nonatomic) IBOutlet NSLayoutConstraint *leftImageWidthAspectRatio;

В коде

cell.leftImageWidthAspectRatio.priority=500;
    cell.leftImagewidthConstaint.constant =cell.leftImagewidthConstaint.constant*cell.leftImageWidthAspectRatio.multiplier;

Это работает успешно

Другие вопросы по тегам