左キャップ、右キャップ、中央の3つの画像があります。おそらく(?)を使用して、あるコンテナの中央のピースを中央に配置し、中央のピースに到達するまで左のキャップを伸ばし、右のキャップも同じであるにCGImageRefs
基づいてビットマップを作成する方法はありますか?CGRect
UIImage
3 に答える
約束通り調べました。解決策は次のとおりです。
基本的な考え方
- 左のキャップを取り、
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をストレッチするだけで同じことが可能になるはずです。
私はそれをプログラムで行うと言います、はい、それは数CPUサイクルを浪費するかもしれませんが、それはもっと楽しいでしょう。
OK、ここに行きます...
ヘッダーに3つのUIImageViewを定義しましょう
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);
}
あなたは奇妙なアプローチです:)
1つの伸縮可能な画像を構成する3つの異なる画像がありますが、特定の方法で使用する必要があるたびに、プログラムで作成したいと考えています。この無駄なCPUサイクル。iOSフレームワークを使用すると、画像を好きなように引き伸ばすことができます。ファイルを画像エディタ(Photoshopなど)で開きます。左右のキャップで囲まれた中央の画像を含む単一の画像を作成します。
これで、この画像を他のすべての画像と同じように使用したり、UIImageメソッドを使用する場合と同じように拡大したりできます。
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
UIEdgeInsetsは、上限を識別する単純な構造体です。したがって、左に15ポイント、右に20ポイントストレッチする必要があるとすると、インセットは次のようになります。上:0ボタン:0左:15右:20
それでおしまい。
詳細はこちら。この記事では、iOS 5.0以降で廃止されたメソッドについて説明していますが、背後にある理論は同じです。