4

我有 3 张图像,左帽、右帽和中心。也许使用CGImageRefs(?),是否有一种方法可以基于 a 构建位图,该位图CGRect将在某个容器中居中,拉伸左帽直到它到达中心部分,右侧同样产生一个UIImage

4

3 回答 3

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 应该是不可能的。

于 2012-08-17T12:46:38.113 回答
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);


}
于 2012-08-17T10:38:13.097 回答
-1

你的方法很奇怪:)

您有三个不同的图像组成一个可拉伸的图像,但您希望在每次必须以某种方式使用它时以编程方式构建它。这浪费cpu循环。iOS 框架允许您随意拉伸图像。在图像编辑器(Photoshop 或类似软件)中打开文件。合成一个包含被左右帽包围的中心图像的单个图像。

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

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

UIEdgeInsets 是一个简单的结构,用于标识您的上限。所以假设你必须向左拉伸 15pt 和向右拉伸 20pt,你的插图将是:顶部:0 按钮:0 左:15 右:20

而已。

在这里了解详情。这篇文章讨论了从 iOS 5.0 及更高版本开始弃用的方法,但背后的理论是相同的。

于 2012-08-17T09:23:59.570 回答