2013-06-25 6 views
2

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

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

+4

Первое золотое правило Autolayout. Не следует смешивать ограничения с расчетами кадров. Второе золотое правило, обновить ограничения постоянной, не каркасные вида по –

+0

@MaxMacLeod Пожалуйста, напишите ответ, и я выберу вас в качестве ответа! Это было так просто, что я просто его не замечал. – Rymnel

ответ

9

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

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

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

Таким образом, вы будете делать что-то вроде:

_myWidthConstraint.constant = 300.f; 

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

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

Как вы это вызвали? При использовании:

[self setNeedsUpdateConstraints]; 

Надеюсь, что это поможет! Для дополнительной информации проверьте отличную статью Оле Бегемана 10 Things You Need To Know About Cocoa Autolayout.

Не забудьте видео WWDC. Это важно!

Кроме того, теперь есть книга iOS Auto Layout Demystified. Хотя я купил его, у меня еще не было возможности прочитать его. Однако это выглядит довольно неплохо.

+1

Я просто переставал называть код, который устанавливал фрейм. Вместо этого я устанавливал высоту ячейки, быть и все отлично работает.Это было слишком легко. Благодаря! – Rymnel

+0

потрясающий! здорово, что ты это сделал –

1

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

Я решил это Непроверка «AUTORESIZE подвиды». enter image description here