使用多个可伸缩图像构建UIImage

时间:2012-08-17 09:08:21

标签: objective-c ios uiimage drawing core-graphics

我有3张图片,一张左帽,右帽和中心。也许使用CGImageRefs(?),有没有办法建立一个基于CGRect的位图,将中心块放在某个容器中心,拉伸左帽直到它到达中心块并且相同为了正确然后产生UIImage

3 个答案:

答案 0 :(得分:6)

好的我按照承诺查了一下。这是一个解决方案:

基本理念

  • 取左边的帽子并制作一个伸展右侧的UIImage
  • 用箭头UIImage
  • “粘合”它
  • 现在将其用右侧盖子与左侧拉伸侧面粘合

这是一个小图,我认为它可以说出来

  ______ ........    ________      .........___________
 {______|........|  | arrow  |    |.........|__________)
left cap|lc flex     --------      rc flex  | right cap

代码

// get the images from disk
UIImage *leftCap = [UIImage imageNamed:@"leftCap.png"];
UIImage *arrow = [UIImage imageNamed:@"arrow.png"];
UIImage *rightCap = [UIImage imageNamed:@"rightCap"];

// stretch left and right cap
// calculate the edge insets beforehand !

UIImage *leftCapStretched = [leftCap resizableImageWithCapInsets:UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)];
UIImage *rightCapStretched = [rightCap resizableImageWithCapInsets:UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)];

CGFloat widthOfAllImages = leftCapStretched.size.width + arrow.size.width + rightCapStretched.size.width;

// build the actual glued image

UIGraphicsBeginImageContextWithOptions(CGSizeMake(widthOfAllImages, arrow.size.height), NO, 0);
[leftCapStretched drawAtPoint:CGPointMake(0, 0)];
[arrow drawAtPoint:CGPointMake(leftCap.size.width, 0)];
[rightCapStretched drawAtPoint:CGPointMake(leftCap.size.width + arrow.size.width, 0)];
UIImage* im = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();

// now you should have a ready to use UIImage ;)

替代

受Jonathan Plaketts的启发,只需UIImageViews就可以回答同样的问题,并按上述方式扩展UIImages。

答案 1 :(得分:1)

我说只是以编程方式进行,是的,它可能会浪费一些CPU周期,但它会更有趣。

好的,我们走了......

让我们在标题

中定义3个UIImageViews
UIImageView *left;
UIImageView *center;
UIImageView *right;

在viewDidLoad中我们将创建它们

left = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"left.jpg"]];
center = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"center.jpg"]];
right = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"right.jpg"]];


[self.view addSubview:left];
[self.view addSubview:center];
[self.view addSubview:right];

//set the position of the center piece wherever you like, whatever size is right for your arrow
[self setCenterFrame:CGRectMake(100,100,100,100)]; //we'll make this function below

然后让我们制作一个方法,你可以用它来设置中心图像的位置,并让其他图像摆动到位,将它们自己拉伸到左右边缘。

-(void)setCenterFrame:(CGRect)rect
{
    center.frame = rect; // this is your arrow

    //set size of left
    left.frame = CGRectMake(0,rect.origin.y, rect.origin.x, rect.size.height);

    //work out how much space there is to the right
    float sizeToTheRight = (self.view.bounds.size.width - rect.size.width) - rect.origin.x ;

    //set size of right
    right.frame = CGRectMake(rect.size.width + rect.origin.x,rect.origin.y, sizeToTheRight, rect.size.height);


}

答案 2 :(得分:-1)

你的方法很奇怪:)

您有三个不同的图像组成一个可伸缩的图像,但您希望每次必须以某种方式使用它时以编程方式构建它。这浪费cpu循环。 iOS框架允许您像往常一样拉伸图像。将文件打开到图像编辑器(Photoshop或类似的东西)。构图包含由左右盖子包围的中心图像的单个图像。

现在您可以将此图像用作其他所有图像,或者您可以像使用UIImage方法一样拉伸它

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

UIEdgeInsets是一个简单的结构,用于识别您的上限。所以假设你必须向左延伸15pt,向右延伸20pt,你的内容将是: 顶部:0 BUTTOM:0 左:15 右:20

就是这样。

Here了解详情。文章讨论了iOS 5.0及以上版本中的一种弃用方法,但背后的理论是相同的。