Автомакет UIImageView с программным изменением размера, не соответствующим ограничениям

Извините за беспокойство, но я пытаюсь лениво загрузить несколько изображений, а затем изменить их размер пропорционально содержимому в UITableView. Я также пытаюсь (возможно, неразумно?) использовать Autolayout практически впервые. И я не понимаю, почему ограничения не работают в этом случае. Вот код, который я использую для изменения размера UIImageView после того, как загрузил в него нужное изображение.

// Scale the image view and return it.
- (UIImageView *) scaleImageViewForScreenWidth:(UIImageView *)imageView {
    UIImage *imgFromView = [imageView image];
    CGRect newFrame = CGRectMake(0, 0, imgFromView.size.width, imgFromView.size.height);

    float imgFactor = newFrame.size.height / newFrame.size.width;
    newFrame.size.width = [[UIScreen mainScreen] bounds].size.width;
    newFrame.size.height = newFrame.size.width * imgFactor;
    [imageView setFrame:newFrame];
    return imageView;
}

Что касается ограничений. Я пытаюсь прикрепить Label и UIImageView с тенью к нижней части основного изображения. Вот ограничения, которые я применяю к нижней тени в изображении. Ограничения нижней тени:

Height Equals:  83
Align Bottom to: Background Image View
LeadingSpace to: Table View Cell

Хотя я не получаю то, что хочу. Есть идеи? Я чувствую, что борюсь с авторазметкой.


person Rymnel    schedule 25.06.2013    source источник
comment
Первое золотое правило Autolayout. Не смешивайте ограничения с расчетами кадров. Второе золотое правило: обновляйте константу ограничений, а не рамку представления.   -  person Max MacLeod    schedule 25.06.2013
comment
@MaxMacLeod Пожалуйста, напишите ответ, и я выберу вас в качестве ответа! Это было настолько просто, что я просто пропустил это.   -  person Rymnel    schedule 25.06.2013


Ответы (2)


Как просили! Вот несколько рекомендаций по использованию Autolayout, которые должны очень помочь.

Во-первых, идеальный подход состоит в том, чтобы настроить все в Interface Builder, чтобы не требовалось никакого дальнейшего программирования. Итак, если, например, границы вашего представления изменяются, то ваше представление автоматически настраивается по мере необходимости.

Если это не помогает, возможно, вам придется программно обновить ограничения. Золотое правило, как я уже упоминал, заключается в том, что вы обновляете ограничения. Не поддавайтесь искушению обновить базовый UIView фрейм!

Итак, вы сделаете что-то вроде:

_myWidthConstraint.constant = 300.f;

Следующее, что нужно отметить, это то, что вы должны сделать это в определенном месте, а именно в вашем методе UIView подкласса updateConstraints:

- (void)updateConstraints
{
    [super updateConstraints];
    _myWidthConstraint.constant = 300.f;
}

Как вы вызываете это? Вызывая:

    [self setNeedsUpdateConstraints];

Надеюсь это поможет! Для получения дополнительной информации см. отличную статью Оле Бегеманна 10 вещей, которые вам нужно знать о Cocoa Autolayout.

Не забывайте видео WWDC. Это необходимо!

Кроме того, появилась книга Демистификация автоматического макета iOS. Хоть я и купила, но еще не успела прочитать. Хотя выглядит неплохо.

person Max MacLeod    schedule 25.06.2013
comment
Я просто перестал вызывать код, устанавливающий фрейм. Вместо этого я устанавливаю высоту ячейки такой, какой она должна быть, и все работает отлично. Вот это да. Это было слишком просто. Спасибо! - person Rymnel; 25.06.2013
comment
классно! отлично у тебя получилось - person Max MacLeod; 25.06.2013

Я также столкнулся с той же проблемой. изображение внутри изображения было слишком большим для изображения, а contentMode было установлено на AspectFill.

Я решил эту проблему, сняв флажок «Автоматическое изменение размера подвидов». введите здесь описание изображения

person thesummersign    schedule 28.06.2015