如何使UIImageView自动调整大小到加载的图像大小

时间:2012-09-26 13:36:31

标签: ios uiimageview resize point touches

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

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

感谢

3 个答案:

答案 0 :(得分:26)

图像的大小与UIImageView的实际大小无关,而UIImageView的大小完全取决于Interface Builder(或您指定给它)的大小。否则,当您使用Retina显示器的@ 2x图像时,图像将会非常糟糕。

如果要解决此问题,还必须在设置图像时更改框架。如果你现在这样做:

[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);

但是这不会改变它所包含的视图布局,你可以使用Layout Constraints在iOS 6下自动更改其他视图的大小。如果您是Apple开发人员,您可以观看WWDC教学视频,他们会解释该系统如何运作良好。

如果您对视图不增长感觉不错,问题就在于当您将图像更改为与包含视图的尺寸不匹配的图像时图像溢出的界限,您可以设置“剪辑子视图” Interface Builder中用于图像视图的复选框。这将使视图不会在其自己的边界框之外绘制任何内容,如果您还将缩放模式设置为“Aspect Fill”或“Scale To Fill”,图像将始终填满包含视图的整个边界

答案 1 :(得分: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;
}

精彩切割&粘贴,必要时使用!

答案 2 :(得分:0)

let containerView = UIView(frame: CGRect(x:0,y:0,width:320,height:500)) 让 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)
    }
}