iOS: Как выровнять (влево / вправо) UIImageView при использовании UIViewContentModeScaleAspectFill?

Я играю со свойством contentMode UIImageView.

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

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

Спасибо

2 ответа

Решение

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

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

Вы можете найти класс на github вместе с примером: https://github.com/reydanro/UIImageViewAligned

Надеюсь, это поможет вам в ваших следующих проектах

Способ iOS сделать это - манипулировать contentRect уровня UIImageView. Рассмотрим следующий пример (в моем собственном подклассе UIImageView) для выравнивания влево или вправо (вместо центра, который используется по умолчанию):

- (void)updateImageViewContentsRect {
    CGRect imageViewContentsRect = CGRectMake(0, 0, 1, 1);

    if (self.image.size.height > 0 && self.bounds.size.height > 0) {

        CGRect imageViewBounds = self.bounds;
        CGSize imageSize = self.image.size;

        CGFloat imageViewFactor = imageViewBounds.size.width / imageViewBounds.size.height;
        CGFloat imageFactor = imageSize.width / imageSize.height;

        if (self.alignmentMode == AHTImageAlignmentModeLeft) {

            if (imageFactor > imageViewFactor) {
                CGFloat scaledImageWidth = imageViewBounds.size.height * imageFactor;
                CGFloat xOffset = (scaledImageWidth - imageViewBounds.size.width) / 2;
                imageViewContentsRect.origin.x = -(xOffset / scaledImageWidth);
            } else if (imageFactor < imageViewFactor) {
                CGFloat scaledImageHeight = imageViewBounds.size.width / imageFactor;
                CGFloat yOffset = (scaledImageHeight - imageViewBounds.size.height) / 2;
                imageViewContentsRect.origin.y = -(yOffset / scaledImageHeight);
            }

        } else if  (self.alignmentMode == AHTImageAlignmentModeRight) {

            if (imageFactor > imageViewFactor) {
                CGFloat scaledImageWidth = imageViewBounds.size.height * imageFactor;
                CGFloat xOffset = (scaledImageWidth - imageViewBounds.size.width);
                imageViewContentsRect.origin.x = (xOffset / scaledImageWidth) / 2;
            } else if (imageFactor < imageViewFactor) {
                CGFloat scaledImageHeight = imageViewBounds.size.width / imageFactor;
                CGFloat yOffset = (scaledImageHeight - imageViewBounds.size.height);
                imageViewContentsRect.origin.y = (yOffset / scaledImageHeight) / 2;
            }

        }
    }
    self.layer.contentsRect = imageViewContentsRect;
}
Другие вопросы по тегам