[英]How to make UIImageView automatically resize to the size of the image loaded
我用 IB 在我的视图上放置了一个 UIImageView 控件。 控件的大小只是我决定的,非常随机的大小我想要做的是每当我将图像属性设置为新图像时自动调整大小的控件。 我希望它实际调整到图像的大小。 可以自动完成吗? 没有任何代码干预? 如果不是 - 在这种情况下最好的方法是什么?
今天发生的事情很奇怪。 我将图像加载到 ImageView 中,即使 ImageView 的大小没有改变,我也看到图像得到正确显示。 这干扰了我抓住用户触摸 ImageView 的意图。 用户触摸实际图像,但由于图像的某些部分在 ImageView 之外(这是奇怪的部分)-点映射变得疯狂有人能想到对此的任何解释吗?
谢谢
图像的大小与 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 说明视频,它们解释了该系统如何工作得很好。
如果您对视图没有增长感到满意,并且问题在于当您将其更改为与包含视图的尺寸不匹配的图像时图像如何溢出其边界,您可以在界面中设置“剪辑子视图”复选框图像视图的构建器。 这将使视图不会在其自己的边界框之外绘制任何内容,如果您还将缩放模式设置为“Aspect Fill”或“Scale To Fill”,则图像将始终填充包含视图的整个边界.
这是我经常剪切和粘贴的代码片段,使用与上面的 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;
}
一个美妙的剪切和粘贴,如果需要使用!
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)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.