将UIImageView适配UIImage大小

4
我有一个UIImage视图,使用AutoLayout和约束设置。 我使用适当的方法将图像适配到ImageView中。
     self.selectPhoto.contentMode = UIViewContentModeScaleAspectFit;
     NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.topLayoutGuide attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.selectPhoto attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
     NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:self.selectPhoto attribute:NSLayoutAttributeBottom relatedBy:0 toItem:self.caption attribute:NSLayoutAttributeTop multiplier:1 constant:-35];
     [self.view addConstraint:topConstraint];
     [self.view addConstraint:bottomConstraint];
     self.selectPhoto.image= existingImage;

这个代码运行得非常好。因为UIImageView是使用AutoLayout设置的,UIImage是使用Aspect Fit显示的,所以我不知道图像的确切框架。我希望图像的左上角在图像视图中的位置为0,0,因为我有另一个较小的图像可以移动到它的上面。 Image 1

例如:由于瀑布图像的方向,左上角在UIImageView中的位置是0,23ish。当图像的高度大于图像的宽度时,原点(图像视图的原点)是66,0。这是一个问题,因为我想绘制两个图像的用户上下文并保存为新图像。但是,我无法做到这一点,因为我不知道2个月图像在瀑布图像上的位置,也不知道瀑布图像的原点。我知道2个月图像在图像视图上的位置,但图像没有占满整个imageView。由于自动布局和适应宽高比,这取决于图像的大小/方向。我将2个月的平移手势添加到瀑布图像视图中,但原点不对齐。附加到2个月视图的平移手势的代码如下:
-(void) handlePan:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
    self.itemToEdit.stickerLocation= recognizer.view.frame;
    NSLog(@"The location of the sticker is %f and y is %f", recognizer.view.frame.origin.x, recognizer.view.frame.origin.y);
}

有没有一种方法可以将UIImageView适配到实际显示的UIImage?基本上我想做类似这样的事情self.selectPhoto.frame = self.selectPhoto.image.frame但我不能这样做。
总之:在使用AutoLayout和Aspect fit放置后,如何知道我的imageView的绝对原点?
1个回答

2
基于这个Stack Overflow答案,我们可以通过访问UIImagesize属性来获取其大小。
所以,从这里开始,最简单的方法是使用自动布局。
在storyboard或xib中设置您的图像视图。 给您的图像视图一个明确的宽度和高度约束。 现在,填写围绕图像视图的其余约束。 请记住,但是,由于我们将不同的图像放入图像视图中,因此图像视图上的明确宽度/高度将发生变化,因此我们的其他自动布局约束必须考虑到这一点。
现在,为我们的明确高度和宽度约束添加一个IBOutlet。 这可以通过与任何其他UI元素添加输出方式完成。 只需从IB中的约束向源文件进行Ctrl+拖动即可。
现在我们有了这样的东西:
@property (nonatomic, weak) NSLayoutConstraint *imageHeight;
@property (nonatomic, weak) NSLayoutConstraint *imageWidth;

现在,每次我们更改图像视图的图像时,我们更新这些约束的constant部分:

self.imageHeight.constant = newImage.size.height;
self.imageWidth.constant = newImage.size.width;

现在,使用上述方法意味着我们的图像视图将始终与我们的图像具有完全相同的大小。这可能意味着它会延伸到屏幕外面或只占用屏幕的一小部分。

另一种方法是使用纵横比约束。再次,首先为图像视图设置一个纵横比约束,将其高度与宽度相关联。现在继续设置视图的其他自动布局约束。也许您想将左上角固定在特定位置。

在执行此操作时,您还需要为图像视图的宽度和高度设置一些小于或等于约束。这些约束将确保无论图像的大小或形状如何,图像视图都会小于您指定的大小(因此保持在屏幕上)。

再次添加一个纵横比约束的输出口。每次更改图像视图的图像时,我们将修改它:

@property (nonatomic, weak) NSLayoutConstraint *imageRatio;

现在,我们不再修改比例约束的constant属性(我们希望将其保留为零),而是要修改multiplier属性。宽度是在上方还是下方取决于约束如何连接,因此可能需要一些试错。但是,我们的目标是像这样的东西:
self.imageRatio.multiplier = newImage.size.height / newImage.size.width;

(再次提醒,这里可能需要反转高度/宽度。)

我使用AspectFit将图像设置在imageView中之前不对其进行调整大小。当我重新指定NSLayoutConstraint时,self.imageHeight.constant = newImage.size.height; imageHeight似乎变成了原始图像高度。重新指定imageWidth(约束)之前= 288,之后= 1500。约束似乎正在调整为实际图像大小,而不是显示的图像。有什么想法吗?感谢详细答复! - leenyburger
尝试使用纵横比详细说明的第二种方法。 - nhgrif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接