首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可阻UIImage

可阻UIImage
EN

Stack Overflow用户
提问于 2013-08-18 21:33:40
回答 4查看 2.6K关注 0票数 0

我知道这个话题有很多问题,我都读过了,但还是没能开始.我试图拉伸一个图像,同时保持它的圆形边缘。

这是我的图像(104x77px):

这是我使用的代码:

代码语言:javascript
复制
UIImage *bg = [UIImage imageNamed:@"btnBg"];
UIEdgeInsets insets = UIEdgeInsetsMake((bg.size.height - 1)/2, (bg.size.width - 1)/2, (bg.size.height - 1)/2, (bg.size.width - 1)/2);
bg = [bg resizableImageWithCapInsets:insets];

UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 50, 44)];
imgView.image = bg;

UIImageView *imgView2 = [[UIImageView alloc] initWithFrame:CGRectMake(20, 70, 250, 44)];
imgView2.image = bg;

[self.view addSubview:imgView];
[self.view addSubview:imgView2];

这就是问题所在:

如你所见,每一幅图像都有不同的边缘。我做错什么了?!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-18 23:19:28

每当涉及到任何缩放时,两个不同维度的图像都不可能完全相同。但是,您可以将图像分成三个部分:左角、中段(只是平行线)和右角。

现在,要创建不同大小的图像视图,您将保持左右部分不变,并缩放中间部分,只要保持高度不变,就不会出现扭曲。

请注意,我将fitInRect的高度设为77,因为这是原始图像的高度。您可以将其更改为,例如,44,但对于所有图像视图,数字保持不变。最后,widthToPreserve必须是最小的34 (这意味着总的直角宽度必须是68或更多),因为这是原始图像中圆形边缘的宽度。

当然,如果您的目标图像视图高度为44,则只需拥有一个较小的图像即可。

此代码适用于:

代码语言:javascript
复制
-(void)viewDidAppear:(BOOL)animated
{
    UIImage *img = [UIImage imageNamed:@"img"];

    UIImageView *view1 = [self getImageViewFromImage:img widthToPreserve:34 fitInRect:CGRectMake(20, 20, 100, 77)];

    UIImageView *view2 = [self getImageViewFromImage:img widthToPreserve:34 fitInRect:CGRectMake(20, 120, 250, 77)];

    [self.view addSubview:view1];
    [self.view addSubview:view2];

}

-(UIImageView*)getImageViewFromImage:(UIImage*)image widthToPreserve:(float)width fitInRect:(CGRect)rect
{
    CGImageRef left, middle, right;
    CGRect leftRect, middleRect, rightRect;
    UIImage *leftImage, *middleImage, *rightImage;
    UIImageView *leftView, *middleView, *rightView;

    // calculate CGRect values for the original image
    leftRect = CGRectMake(0, 0, width, image.size.height);
    middleRect = CGRectMake(width, 0, image.size.width - 2*width, image.size.height);
    rightRect = CGRectMake(image.size.width - width, 0, width, image.size.height);

    left = CGImageCreateWithImageInRect([image CGImage], leftRect);
    middle = CGImageCreateWithImageInRect([image CGImage], middleRect);
    right = CGImageCreateWithImageInRect([image CGImage], rightRect);


    leftImage = [UIImage imageWithCGImage:left];
    middleImage = [UIImage imageWithCGImage:middle];
    rightImage = [UIImage imageWithCGImage:right];

    leftView = [[UIImageView alloc] initWithImage:leftImage];
    middleView = [[UIImageView alloc] initWithImage:middleImage];
    rightView = [[UIImageView alloc] initWithImage:rightImage];

    //make your image subviews, with scaling on the middle view
    [leftView setFrame:CGRectMake(0, 0, width, rect.size.height)];
    [middleView setFrame:CGRectMake(width, 0, rect.size.width - 2*width, rect.size.height)];
    [rightView setFrame:CGRectMake(rect.size.width - width, 0, width, rect.size.height)];

//add your 3 subviews into a single image view
    UIImageView *imgView = [[UIImageView alloc] initWithFrame:rect];
    [imgView addSubview:leftView];
    [imgView addSubview:middleView];
    [imgView addSubview:rightView];


    CGImageRelease(left);
    CGImageRelease(middle);
    CGImageRelease(right);

    return imgView;
}

截图:

票数 0
EN

Stack Overflow用户

发布于 2013-08-18 21:40:45

我想你要找的是一个可伸缩的图像

代码语言:javascript
复制
[[UIImage imageNamed:@"someimage.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5];

正如麦迪指出的,这在iOS 5中是不可取的,对于我们这些可怜的灵魂必须支持iOS 4.3的人来说,这就是我们所使用的。

票数 1
EN

Stack Overflow用户

发布于 2013-08-18 22:02:16

您可以为图像指定驻留模式。选择是UIImageResizingModeStretchUIImageResizingModeTile

有一个可伸缩图像的想法是为了你可以有一个小的图像文件。您应该考虑使用较小的图像来节省应用程序包中的空间。另外,你的左、右边框不一定要在中间。它们应该就在曲线之外,在你的图像中,曲线看起来大约是40分。

下面是用来设置调整大小模式的代码:

代码语言:javascript
复制
bg = [bg resizableImageWithCapInsets:insets resizingMode: UIImageResizingModeStretch];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18303889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档