2015-06-16 6 views
3

У меня есть представление UIImage, которое настроено с использованием AutoLayout и ограничений. Я подгоняю изображение к изображению с помощьюУстановите UIImageView на UIImage

 self.selectPhoto.contentMode = UIViewContentModeScaleAspectFit; 
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.selectPhoto attribute:NSLayoutAttributeTop multiplier:1 constant:-10]; 
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.selectPhoto attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.caption attribute:NSLayoutAttributeTop multiplier:1 constant:-35]; 
    [self.view addConstraint:topConstraint]; 
    [self.view addConstraint:bottomConstraint]; 
    self.selectPhoto.image= existingImage; 

Это прекрасно работает. Поскольку UIImageView настроен с использованием AutoLayout, а UIImage отображается с использованием Aspect Fit, я не знаю точный кадр изображения. Я хочу, чтобы верхний левый угол изображения был на 0,0 в представлении изображения, потому что у меня есть еще меньшее изображение, которое пользователь может перемещать поверх него. Image 1

Например: из-за ориентации изображения водопада верхний левый угол 0,23ish в UIImageView. Когда высота изображения> ширина изображения, начало координат (изображения) составляет 66,0. Это проблема, потому что я хочу затем нарисовать пользовательский контекст обоих изображений и сохранить как новое изображение. Я не могу этого сделать, потому что я не знаю, где изображение 2 месяца помещается на изображение водопада, потому что я не знаю происхождения изображения водопада. Я знаю, где изображение 2 месяца находится на изображении VIEW, но изображение не занимает весь imageView. Из-за AutoLayout и Aspect Fit он отличается в зависимости от размера/ориентации изображения. Я добавил жест 2Months Pan к представлению изображения водопада, но происхождение не выстраивается в линию. Код для панорамирования жеста, который прилагается к представлению 2months выглядит следующим образом

-(void) handlePan:(UIPanGestureRecognizer *)recognizer { 
    CGPoint translation = [recognizer translationInView:self.view]; 
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,recognizer.view.center.y + translation.y); 
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view]; 
    self.itemToEdit.stickerLocation= recognizer.view.frame; 
    NSLog(@"The location of the sticker is %f and y is %f", recognizer.view.frame.origin.x, recognizer.view.frame.origin.y); 
} 

Есть ли способ, чтобы соответствовать UIImageView к фактическому отображаемому UIImage? В основном я хочу сделать что-то вроде self.selectPhoto.frame = self.selectPhoto.image.frame Который я не могу сделать.

Подводя итог: Как узнать абсолютное происхождение моего изображенияПросмотр после того, как он был установлен с использованием AutoLayout и Aspect?

ответ

2

Основано на this Stack Overflow answer, мы можем получить размер UIImage, обратившись к его size.

Итак, отсюда самый простой способ продолжить использовать автозапуск.

Настройте свою раскадровку или xib с изображением на нем. Идите вперед и дайте вашему изображению явное ограничение ширины и высоты. Теперь заполните остальные ограничения вокруг изображения. Однако имейте в виду, что эта явная ширина/высота изображения будет меняться по мере того, как мы отбрасываем разные изображения в изображение, поэтому наши другие ограничения автоопределения должны помнить об этом.

Теперь добавьте IBOutlet для наших явных ограничений по высоте и ширине. Это можно сделать так же, как мы добавляем выход для любого другого элемента интерфейса. Просто Ctrl + перетащить из ограничения в IB в исходный файл.

Теперь у нас есть что-то вроде этого:

@property (nonatomic, weak) NSLayoutConstraint *imageHeight; 
@property (nonatomic, weak) NSLayoutConstraint *imageWidth; 

Теперь, каждый раз, когда мы изменяем изображение вида изображения, мы обновляем constant часть этих ограничений:

self.imageHeight.constant = newImage.size.height; 
self.imageWidth.constant = newImage.size.width; 

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

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

Пока вы это делаете, вы также захотите установить некоторые ограничения или равные ограничениям для ширины и высоты изображения. Эти ограничения будут гарантировать, что независимо от размера или формы изображения изображение будет меньше вашего указанного размера (и, следовательно, останется на экране).

Еще раз добавьте розетку для ограничения соотношения сторон. Мы будем изменять это каждый раз, когда мы изменяем изображение вида изображения в:

@property (nonatomic, weak) NSLayoutConstraint *imageRatio; 

Теперь, вместо свойства constant (мы хотим оставить, что в нуле), мы будем модифицировать multiplier свойства отношения ограничение. Независимо от того, находится ли ширина сверху или снизу, зависит от того, как привязано ограничение, поэтому для этого может потребоваться некоторая пробная версия и ошибка. Но суть его в том, что мы хотим что-то вроде этого:

self.imageRatio.multiplier = newImage.size.height/newImage.size.width; 

(И опять же, возможно, придется переворачивать высота/ширина здесь.)

+0

Я не изменить размер изображения перед установкой его в imageView с использованием AspectFit. Когда я переназначаю NSLayoutConstraint self.imageHeight.constant = newImage.size.height; imageHeight кажется оригинальной высотой изображения. Прежде чем переназначить imageWidth (ограничение) = 288, после imageWidth (ограничение) = 1500. Ограничения, по-видимому, изменяются до фактического изображения, а не отображаемого изображения. Есть предположения? Thx для подробного ответа! – leenyburger

+0

Попробуйте второй подход, который я подробно рассмотрел с использованием соотношения сторон. – nhgrif

Смежные вопросы