我有3张图片,一张左帽,右帽和中心。也许使用CGImageRefs
(?),有没有办法建立一个基于CGRect
的位图,将中心块放在某个容器中心,拉伸左帽直到它到达中心块并且相同为了正确然后产生UIImage
?
答案 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个UIImageViewsUIImageView *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及以上版本中的一种弃用方法,但背后的理论是相同的。