iOS:使用 UIViewContentModeScaleAspectFill 时如何对齐(左/右) UIImageView?

Posted

技术标签:

【中文标题】iOS:使用 UIViewContentModeScaleAspectFill 时如何对齐(左/右) UIImageView?【英文标题】:iOS: How to align (left/right) a UIImageView when using UIViewContentModeScaleAspectFill? 【发布时间】:2013-02-14 15:56:33 【问题描述】:

我正在使用 UIImageView 的 contentMode 属性。

当我将它设置为 UIViewContentModeScaleAspectFill 时,图像会缩放以适应屏幕。 它居中。所以图片的左右(或上下,取决于屏幕方向)部分被剪裁了。

我希望有相同的行为但不居中。是否可以仅在右侧(或左侧)裁剪图像? (又是顶部还是底部,取决于方向)?

谢谢

【问题讨论】:

【参考方案1】:

我知道自二月份以来已经有一段时间了,但我刚刚在我正在开发的应用程序中遇到了同样的需求。

我使用自定义 UIImageView 解决了这个问题,它可以轻松集成到您现有的代码中(它是 UIImageView 的直接替代品)。

您可以在 github 上找到该类,以及一个示例: https://github.com/reydanro/UIImageViewAligned

希望这对您的下一个项目有所帮助

【讨论】:

【参考方案2】:

ios 的做法是操作 UIImageView 的 layer 的 contentsRect。考虑以下示例(在我的自定义 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;

【讨论】:

以上是关于iOS:使用 UIViewContentModeScaleAspectFill 时如何对齐(左/右) UIImageView?的主要内容,如果未能解决你的问题,请参考以下文章

[iOS] 在 ios10 中使用 imessage

使用 SmartFace.io 录制音频(Android - Ios)

iOS - 如何使用 branch.io 在 Appstore 中测试深度链接

IOS AlterView的使用(IOS8.0以前使用)

iOS归档使用

Agora.io - 如何使用 mediaPlayer 共享视频时间戳? - iOS