Как установить UIImageView влево или вправо при установке contentMode в UIViewContentModeScaleAspectFit?

Я хочу управлять выравниванием изображения при использовании UIViewContentModeScaleAspectFit в UIImageView.

enter image description here

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

Я пытаюсь установить contentMode на UIViewContentModeScaleAspect|UIViewContentModeLeft, но это еще хуже.

Любые предложения приветствуются.

Ответы

Ответ 1

Наконец, я нахожу проект UIImageViewAligned, который может решить его.

Благодаря @Marchy появилась также быстрая версия UIImageViewAlignedSwift

Ответ 2

Вместо того, чтобы пытаться выровнять изображение в представлении изображения, вы можете программно добавить ограничение ширины в представление изображения, чтобы не было "лишнего пространства".

Предположим, что у вас есть UIImageView с режимом содержимого Aspect Fit и фиксированное ограничение высоты, добавленное в построителе интерфейса. Затем в соответствующем контроллере просмотра проверьте соотношение сторон изображения и примените необходимое ограничение ширины, чтобы привязать изображение к содержащемуся изображению. Например:.

@IBOutlet weak var imageView: UIImageView!

override func viewDidLoad() {
    super.viewDidLoad()

    // UIImage loaded from somewhere...
    imageView.image = uiImage

    // Check the UIImageView for existing height constraints
    let heightConstraints = imageView.constraints.filter{$0.firstAttribute == .height}
    if let imageViewHeight = heightConstraints.first?.constant {

        // Calculate the width which would make the image view fit
        // the image perfectly, and constrain the view to that width.
        let desiredImageViewWidth = (imageViewHeight / uiImage.size.height) * uiImage.size.width
        imageView.addConstraint(NSLayoutConstraint(item: imageView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: desiredImageViewWidth))
    }
}

Чтобы применить это к вашей проблеме, вы можете ограничить ваши два UIImageView рядом друг с другом, установить фиксированное ограничение высоты для обоих (одного и того же значения), а затем программно установить ширину с помощью вышеуказанного кода.

Ответ 3

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

Вы можете найти информацию об обрезке UIImage здесь: Обрезка UIImage

Ответ 4

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

enter image description here

Это будет удовлетворять ограничениям, пока изображение не будет добавлено. Затем установите для UIImageView Content Hugging Priority высокое значение для ширины (или высоты, если вы выравниваете верх/низ).

enter image description here

Затем просто установите режим содержимого UIImageView на то, что вы хотите. Надеюсь это поможет!