【问题标题】:How to make UIImageView automatically resize to the size of the image loaded如何使 UIImageView 自动调整为加载图像的大小
【发布时间】:2012-09-26 13:36:30
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 有人吗?到处都找不到

标签: ios uiimageview resize point touches


【解决方案1】:

图像的大小与 UIImageView 的实际大小无关,而 UIImageView 的大小仅取决于 Interface Builder 中赋予它的大小(或您分配给它的大小)。否则,例如,当您将 @2x 图像用于 Retina 显示器时,图像会很奇怪。

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

[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 下使用布局约束自动改变其他视图的大小。如果您是 Apple 开发人员,您可以观看 WWDC 说明视频,他们解释了该系统如何运作良好。

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

【讨论】:

  • 谢谢。明白了。你能解释一下你的第一段吗?不知道我明白了
【解决方案2】:

这里是我经常剪切粘贴的代码sn-p,使用的方法和上面的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;
}

一个美妙的剪切和粘贴,如果需要使用!

【讨论】:

    【解决方案3】:

    让 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)
        }
    }
    

    【讨论】:

    • 你可以使用3个反引号来创建代码块,你可以在代码中添加细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多