UIImage方面适合并alignment顶部
它看起来像aspect fit
默认情况下图像alignment框架的底部。 有没有办法来覆盖alignment,同时保持aspect fit
完好?
**编辑**
这个问题早于自动布局。 事实上,在这个问题被问到的同一个星期,WWDC在2012年展示了自动布局
总之,你不能用UIImageView
做到这一点。
一种解决scheme是对包含UIImageView
的UIView
进行子类化,并根据图像大小更改其框架。 例如,你可以在这里find一个版本。
我有类似的问题。 最简单的方法是创build自己的UIImageView的子类。 我添加了子类3的属性,所以现在可以在不知道内部实现的情况下使用easly:
@property (nonatomic) LDImageVerticalAlignment imageVerticalAlignment; @property (nonatomic) LDImageHorizontalAlignment imageHorizontalAlignment; @property (nonatomic) LDImageContentMode imageContentMode;
你可以在这里查看: https : //github.com/LucasssD/LDAlignmentImageView
只需将imageView的底部布局约束优先级设置为最低(即250),它将完成工作
这样做的方法是修改UIImageView图层的contentsRect。 从我的项目(UIImageView的子类)下面的代码假定scaleToFill和偏移图像,使其alignment顶部,底部,左侧或右侧,而不是默认的中心alignment。 对于aspectFit是一个类似的解决scheme。
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; }
我在Interface Builder中通过设置UIImageView的高度约束来解决这个问题,因为当图像大于屏幕尺寸时,图像总是被“推”出来。
更具体地说,我将UIImageView设置为与它所在的视图(通过高度约束)相同的高度,然后使用IB中的间距约束来定位UIImageView。 这导致UIImageView具有“Aspect Fit”,它依然尊重我在IB中设置的顶部间距约束。
如果你能够UIImageView
,那么你可以重写image
var。
override var image: UIImage? { didSet { self.sizeToFit() } }
在Objective-C中,你可以通过重写setter来做同样的事情。