如何使UIImageView自动调整大小以适应加载的图像大小

20

我在IB中将UIImageView控件放在视图上。 控件的大小只是我随意决定的,实际上是一个随机的尺寸。 我想要做的是,每当我设置image属性为新图像时,控件可以自动调整大小。我希望它能够实际上调整到图像的大小。 是否可以自动完成?不需要任何代码干预吗? 如果不能-在这种情况下最好的方法是什么?

今天发生的事情很奇怪。我将图像加载到ImageView中,即使ImageView的大小没有改变,我也可以看到图像正确地显示。这干扰了我抓取用户触摸ImageView的意图。用户触摸实际图像,但由于图像的某些部分位于(这是奇怪的部分)ImageView之外 - 点映射变得混乱。 有人能想到任何解释吗?

谢谢


有人吗?无论在哪里都找不到。 - Louis Shraga
3个回答

27

一张图片的大小并不影响UIImageView实际的大小,UIImageView的大小完全取决于在Interface Builder中给它分配的大小(或者你为其分配的大小)。否则,例如当你使用@2x图片显示Retina屏幕时,图片会变得很奇怪。

如果你想要解决这个问题,那么在设置图片时,你必须同时改变frame。如果您现在正在这样做:

[imageView setImage:[UIImage imageNamed:@"myImage.jpg"]];

将其改为:

UIImage img = [UIImage imageNamed:@"myImage.jpg"];
[imageView setImage:img];
imageView.frame = CGRectMake(imageView.frame.origin.x, imageView.frame.origin.y,
                             img.size.width, img.size.height);

然而,这不会改变所包含视图的布局,在 iOS 6 中,您可以使用布局约束自动更改其他视图的大小。如果您是苹果开发人员,可以观看 WWDC 指令视频,它们很好地解释了该系统的工作原理。

如果您不介意视图不会增长,并且问题只是当您将其更改为与包含视图维度不匹配的图像时,它如何溢出其边界,您可以在 Interface Builder 中为图像视图设置“剪辑子视图”复选框。这将使视图不会绘制超出其边界框的任何内容,如果您还将缩放模式设置为“Aspect Fill”或“Scale To Fill”,则图像将始终填充包含视图的整个边界。


2
谢谢。我明白了。您能否再详细解释一下您的第一段?我不确定是否完全理解了。 - Louis Shraga
如果图像高度为1550 * 2025,会发生什么? - Shourob Datta

1
这是我经常剪贴和粘贴的代码片段,使用与上面Hampus Nilsson相同的方法 - 示例
func demo(x0:CGFloat, y0:CGFloat) {
    let imgView = UIImageView(image: UIImage(named: "someImg.png"));
    imgView.sizeToImage();
    imgView.center = CGPoint(x:x0, y:y0);
}

UIImageView扩展

extension UIImageView {

/******************************************************************************/
/** @fcn        sizeToImage()
 *  @brief      size view to image
 *  @@assum     (image!=nil)
 */
/******************************************************************************/
func sizeToImage() {

    //Grab loc
    let xC = self.center.x;
    let yC = self.center.y;

    //Size to fit
    self.frame  = CGRect (x: 0, y: 0, width: (self.image?.size.width)!/2, height: (self.image?.size.height)!/2);

    //Move to loc
    self.center = CGPoint(x:xC, y:yC);

    return;
}

一个精彩的剪切和粘贴,如果需要可以使用!

0

let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500)) let imageView = UIImageView()

let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500)) let imageView = UIImageView()

if let image = UIImage(named: "Image_Name_Here") {
    let ratio = image.size.width / image.size.height
    if containerView.frame.width > containerView.frame.height {
        let newHeight = containerView.frame.width / ratio
        imageView.frame.size = CGSize(width: containerView.frame.width, height: newHeight)
    }
    else{
        let newWidth = containerView.frame.height * ratio
        imageView.frame.size = CGSize(width: newWidth, height: containerView.frame.height)
    }
}

你可以使用三个反引号来创建代码块,并且可以为代码添加详细信息。 - Chandan

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