UIImage аспект подходит и выравнивается сверху

Это выглядит какaspect fit выравнивает изображение по низу рамки по умолчанию. Есть ли способoverride выравнивание при сохраненииaspect fit без изменений?

** РЕДАКТИРОВАТЬ **

This question predates auto layout. In fact, auto layout was being revealed in WWDC 2012 the same week this question was asked

 tommybananas30 апр. 2014 г., 23:22
Я знаю, что это старо, но это решение отлично подходит для людей, которые находят эту тему, как я:github.com/reydanro/UIImageViewAligned

Ответы на вопрос(7)

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

@property (nonatomic) LDImageVerticalAlignment imageVerticalAlignment;
@property (nonatomic) LDImageHorizontalAlignment imageHorizontalAlignment;
@property (nonatomic) LDImageContentMode imageContentMode;

Вы можете проверить это здесь: https://github.com/LucasssD/LDAlignmentImageView

установив ограничение на высоту UIImageView, так как изображение всегда будет «выталкиваться». вверх, когда изображение было больше, чем размер экрана.

В частности, я установил UIImageView равной высоте с представлением, в котором он находится (с помощью ограничения высоты), затем разместил UIImageView с ограничениями на интервалы в IB. Это приводит к тому, что UIImageView имеет «Соотношение сторон»; который все еще соблюдает ограничение верхнего расстояния, которое я установил в IB.

Add the Aspect Ratio constraint with your image proportions. Do not pin UIImageView to bottom. If you want to change the UIImage dynamically remember to update aspect ratio constraint.

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

typedef NS_OPTIONS(NSUInteger, AHTImageAlignmentMode) {
    AHTImageAlignmentModeCenter = 0,
    AHTImageAlignmentModeLeft = 1 << 0,
    AHTImageAlignmentModeRight = 1 << 1,
    AHTImageAlignmentModeTop = 1 << 2,
    AHTImageAlignmentModeBottom = 1 << 3,
    AHTImageAlignmentModeDefault = AHTImageAlignmentModeCenter,
};

- (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 (imageFactor > imageViewFactor) {
            //Image is wider than the view, so height will match
            CGFloat scaledImageWidth = imageViewBounds.size.height * imageFactor;
            CGFloat xOffset = 0.0;
            if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeLeft)) {
                xOffset = -(scaledImageWidth - imageViewBounds.size.width) / 2;
            } else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeRight)) {
                xOffset = (scaledImageWidth - imageViewBounds.size.width) / 2;
            }
            imageViewContentsRect.origin.x = (xOffset / scaledImageWidth);
        } else if (imageFactor < imageViewFactor) {
            CGFloat scaledImageHeight = imageViewBounds.size.width / imageFactor;

            CGFloat yOffset = 0.0;
            if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeTop)) {
                yOffset = -(scaledImageHeight - imageViewBounds.size.height) / 2;
            } else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeBottom)) {
                yOffset = (scaledImageHeight - imageViewBounds.size.height) / 2;
            }
            imageViewContentsRect.origin.y = (yOffset / scaledImageHeight);
        }
    }
    self.layer.contentsRect = imageViewContentsRect;
}
Swift version
class AlignmentImageView: UIImageView {

    enum HorizontalAlignment {
        case left, center, right
    }

    enum VerticalAlignment {
        case top, center, bottom
    }


    // MARK: Properties

    var horizontalAlignment: HorizontalAlignment = .center
    var verticalAlignment: VerticalAlignment = .center


    // MARK: Overrides

    override var image: UIImage? {
        didSet {
            updateContentsRect()
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        updateContentsRect()
    }


    // MARK: Content layout

    private func updateContentsRect() {
        var contentsRect = CGRect(origin: .zero, size: CGSize(width: 1, height: 1))

        guard let imageSize = image?.size else {
            layer.contentsRect = contentsRect
            return
        }

        let viewBounds = bounds
        let imageViewFactor = viewBounds.size.width / viewBounds.size.height
        let imageFactor = imageSize.width / imageSize.height

        if imageFactor > imageViewFactor {
            // Image is wider than the view, so height will match
            let scaledImageWidth = viewBounds.size.height * imageFactor
            var xOffset: CGFloat = 0.0

            if case .left = horizontalAlignment {
                xOffset = -(scaledImageWidth - viewBounds.size.width) / 2
            }
            else if case .right = horizontalAlignment {
                xOffset = (scaledImageWidth - viewBounds.size.width) / 2
            }

            contentsRect.origin.x = xOffset / scaledImageWidth
        }
        else {
            let scaledImageHeight = viewBounds.size.width / imageFactor
            var yOffset: CGFloat = 0.0

            if case .top = verticalAlignment {
                yOffset = -(scaledImageHeight - viewBounds.size.height) / 2
            }
            else if case .bottom = verticalAlignment {
                yOffset = (scaledImageHeight - viewBounds.size.height) / 2
            }

            contentsRect.origin.y = yOffset / scaledImageHeight
        }

        layer.contentsRect = contentsRect
    }

}
 10 нояб. 2018 г., 15:46
Спасибо, мужчина, что поделился. Возможно, это идеальное решение :)

ый низкий (то есть 250), и он сделает всю работу.

UIImageView.

Одним из решений является подклассUIView содержащийUIImageView и измените его рамку в соответствии с размером изображения. Например, вы можете найти одну версиюВот.

 24 мая 2016 г., 21:55
Если вы можете переопределить UIImageView (как я делаю ниже), вы можете сделать это за один раз
 25 мая 2016 г., 15:25
Не совсем такой же эффект нужен ОП.

UIImageViewтогда вы можете просто переопределитьimage вар.

override var image: UIImage? {
    didSet {
        self.sizeToFit()
    }
}

В Objective-C вы можете сделать то же самое, переопределив сеттер.

Ваш ответ на вопрос