4

左キャップ、右キャップ、中央の3つの画像があります。おそらく(?)を使用して、あるコンテナの中央のピースを中央に配置し、中央のピースに到達するまで左のキャップを伸ばし、右のキャップも同じであるにCGImageRefs基づいてビットマップを作成する方法はありますか?CGRectUIImage

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サイクルを浪費するかもしれませんが、それはもっと楽しいでしょう。

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);


}
于 2012-08-17T10:38:13.097 に答える
-1

あなたは奇妙なアプローチです:)

1つの伸縮可能な画像を構成する3つの異なる画像がありますが、特定の方法で使用する必要があるたびに、プログラムで作成したいと考えています。この無駄なCPUサイクル。iOSフレームワークを使用すると、画像を好きなように引き伸ばすことができます。ファイルを画像エディタ(Photoshopなど)で開きます。左右のキャップで囲まれた中央の画像を含む単一の画像を作成します。

これで、この画像を他のすべての画像と同じように使用したり、UIImageメソッドを使用する場合と同じように拡大したりできます。

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

UIEdgeInsetsは、上限を識別する単純な構造体です。したがって、左に15ポイント、右に20ポイントストレッチする必要があるとすると、インセットは次のようになります。上:0ボタン:0左:15右:20

それでおしまい。

詳細はこちら。この記事では、iOS 5.0以降で廃止されたメソッドについて説明していますが、背後にある理論は同じです。

于 2012-08-17T09:23:59.570 に答える