我想更改我的UIImageView高度/宽度以匹配我从相册中选择的图像,我在这里找到了一个代码片段。
-(CGRect)frameForImage:(UIImage *)imgs inImageViewAspectFit:(UIImageView *)imagev
{
float imageRatio = imgs.size.width / imgs.size.height;
float viewRatio = imagev.frame.size.width / imagev.frame.size.height;
if(imageRatio < viewRatio)
{
float scale = imagev.frame.size.height / imgs.size.height;
float width = scale * imgs.size.width;
float topLeftX = (imagev.frame.size.width - width) * 0.5;
NSLog(@"image after aspect fit: width=%f",width);
imagev.frame = CGRectMake(topLeftX, 0, width, imagev.frame.size.height);
return CGRectMake(topLeftX, 0, width, imagev.frame.size.height);
}
else
{
float scale = imagev.frame.size.width / imgs.size.width;
float height = scale * imgs.size.height;
float topLeftY = (imagev.frame.size.height - height) * 0.5;
NSLog(@"image after aspect fit: height=%f", height);
imagev.frame = CGRectMake(0, topLeftY, imagev.frame.size.width, height);
return CGRectMake(0, topLeftY, imagev.frame.size.width, height);
}
}
问题是,当我从按钮
调用它时,它会改变UIImageView的高度/宽度- (IBAction)changeSize:(id)sender
{
[self frameForImage:image inImageViewAspectFit:self.imageView];
}
但是我希望它一旦我从相册中选择一张图片就能做到这一点,这就是我设置它的方式。
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imageView setImage:image];
[self frameForImage:image inImageViewAspectFit:self.imageView];
[self dismissViewControllerAnimated:YES completion:NULL];
}
答案 0 :(得分:32)
自从确定您在项目中使用自动布局后,我制作了一个演示应用程序,向您展示如何更改图像视图的图像并调整高度。自动布局会自动为您完成此操作,但问题在于您将使用的照片来自用户库,因此它们可能非常大而且这个。
请查看应用:https://bitbucket.org/danielphillips/auto-layout-imageview
诀窍是创建图像视图高度的NSLayoutConstraint
的引用。更改图像时,需要在给定固定宽度的情况下将其常量调整到正确的高度。
您的其他解决方案可能是在图片视图上设置contentMode
,使用UIViewContentModeScaleAspectFit
您的图片将始终显示为完整但会锁定到图片视图的边界,这可能会更改基于您的自动布局约束。
除非我错过了什么,否则看起来你真的过于复杂了。
当您从图像选择器获取新图像时,您需要做的就是根据UIImage
尺寸更改图像视图的边框。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
image = [info objectForKey:UIImagePickerControllerOriginalImage];
[self.imageView setImage:image];
self.imageView.frame = CGRectMake(self.imageView.frame.origin.x
self.imageView.frame.origin.y
image.size.width
image.size.height);
[self dismissViewControllerAnimated:YES completion:NULL];
}
当然这可能会非常大(它使用的原始图像可能非常大)。
所以让我们将宽度锁定到280点......这样我们就可以在纵向模式下在屏幕上显示完整的图像。
因此,假设您的图像大小为1000x800,我们的图像视图可能是280x100。我们可以计算图像视图的正确高度,保留图像视图的宽度,如下所示:
CGSize imageSize = CGSizeMake(1000.0, 800.0);
CGSize imageViewSize = CGSizeMake(280.0, 100.0);
CGFloat correctImageViewHeight = (imageViewSize.width / imageSize.width) * imageSize.height;
self.imageView.frame = CGRectMake( self.imageView.frame.origin.x,
self.imageView.frame.origin.x,
CGRectGetWidth(self.imageView.bounds),
correctImageViewHeight);
答案 1 :(得分:5)
这是一个Swift类,它将根据您选择的宽度或高度限制帮助返回正确的图像大小:
class func returnImageSizeForHeightLimit(heightLimit:CGFloat?, orWidthLimit widthLimit:CGFloat?, forImage theImage:UIImage)->CGSize?{
if let myHeightLimit = heightLimit {
let theWidth = (myHeightLimit/theImage.size.height) * theImage.size.width
return CGSizeMake(theWidth, myHeightLimit)
}
if let myWidthLimit = widthLimit {
let theHeight = (myWidthLimit/theImage.size.width) * theImage.size.height
return CGSizeMake(myWidthLimit, theHeight)
}
return nil
}