2009-03-25 2 views
8

UIImageViewのようなUIオブジェクトを作成し、その内部に画像をタイルすることができます。CGContextDrawTiledImageを使用してイメージをタイル表示するにはどうすればよいですか?

CGContextDrawTiledImageを使用して、メインウィンドウの背景を更新できましたが、イメージビューは更新できませんでした。 MainViewクラス内のdrawRect関数を変更すると、これを行うことができます。

私は近くにいると感じますが、まだ何かが欠けています。誰かが私を正しい方向に向けることができますか?

- (void)drawRect:(CGRect)rect { 

CGImageRef image = CGImageRetain(currentImage.CGImage); 

CGRect imageRect; 
imageRect.origin = CGPointMake(160, 240); 
imageRect.size = CGSizeMake(320.0, 480.0); 

CGContextRef uiContext = UIGraphicsGetCurrentContext(); 

CGContextClipToRect(uiContext, CGRectMake(0.0, 0.0, rect.size.width, rect.size.height)); 

CGContextDrawTiledImage(uiContext, imageRect, image); 

}

+1

これは私が知っている、非常に古い質問です:念のために誰もがここでつまずく:あなたはUIImageViewののdrawRectをオーバーライドするべきではない - 私はそれがこの制限付きのUIKitで唯一のUIViewサブクラスだと思う...私が使用する –

答えて

17

のは、あなたがタイルにしたい画像のためのCGImageRefを持っているとしましょうtileImageimageView呼ばUIImageViewと呼ばれます。あなたがする必要があるのはimageプロパティに割り当てられるUIImageを作成してimageViewです。

CGSize imageViewSize = imageView.bounds.size; 
UIGraphicsBeginImageContext(imageViewSize); 
CGContextRef imageContext = UIGraphicsGetCurrentContext(); 
CGContextDrawTiledImage(imageContext, (CGRect){ CGPointZero, imageViewSize }, tileImage); 
UIImage *finishedImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

imageView.image = finishedImage; 

これは、その後UIImageViewに割り当て、コンテキストの外にUIImageを取得し、そのコンテキストにタイル画像を、所望の大きさのビットマップ画像のコンテキストを作成します:あなたはこのようにそれを行うことができます。画像ビューとタイル画像がロードされ、移動する準備ができている限り、このコードを実際にどこにでも置くことができます。

2

よりもむしろUIImageViewを変更しようとすると、代わりのUIViewをサブクラス化することを検討。 UIImageViewは、タイル張られていない1つの画像用に特別に設計されており、内部構造の一部があなたを台無しにしている可能性があります。あなたが記述する方法で修正するつもりはありません。

UIView(UITiledImageView?)のサブクラスでは、drawRect:メソッドを使用して必要な処理を行うことができます。イメージのイーバール、サイズとタイルのプロパティを作成して、柔軟性と拡張性を高めることもできます。 http://github.com/kailoa/6tringle-tiledimageview/tree/master

関連の描画コード:サンプルプロジェクトを更新しました

- (void)drawRect:(CGRect)rect 
{ 
    if (TiledImage) { 

     //Since we are retaining the image, we append with ret_ref. this reminds us to release at a later date. 
     CGImageRef image_to_tile_ret_ref = CGImageRetain(TiledImage.CGImage); 

     CGRect image_rect; 
     image_rect.size = TiledImage.size; //This sets the tile to the native size of the image. Change this value to adjust the size of an indivitual "tile." 

     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextDrawTiledImage(context, image_rect, image_to_tile_ret_ref); 

     CGImageRelease(image_to_tile_ret_ref); 
    } 
} 
0

私は最近、カスタムUIViewのを作成することによって、これをしませんでした。

@interface TiledImageView : UIView { 
@private 
    UIImage *image_; 
} 

@property (nonatomic, retain) UIImage *image; 
@end 

との.mファイル用:

@implementation TiledImageView 
@synthesize image = image_; 

- (void)dealloc { 
    [image_ release]; 
    [super dealloc]; 
} 

- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // Initialization code 
     self.image = [UIImage imageNamed:@"BGTile.png"]; 

    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    // Drawing code 
    CGImageRef image = CGImageRetain(image_.CGImage); 

    CGRect imageRect; 
    imageRect.origin = CGPointMake(0.0, 0.0); 
    imageRect.size = CGSizeMake(CGImageGetWidth(image), CGImageGetHeight(image)); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextClipToRect(context, CGRectMake(0.0, 0.0, rect.size.width, rect.size.height)); 
    CGContextDrawTiledImage(context, imageRect, image); 
    CGImageRelease(image); 
} 

@end 
26

あなただけのタイルに表示中の画像をしたい場合は、通常のUIViewとタイルUIColor initWithPatternImageと背景のように変更します。の他の回答にコメントを追加する方法を知らないため

backgroundView.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageWithContentsOfFile:[self bundlePath:@"some_tile_image.png" inDirectory:@"tiles"]]]; 
+2

を - [UIImage imageNamed:]ここでは、同じ考えです。オフセットを変更することも可能だと思いますが、正確には思い出さないでください。 –

+1

これは完璧です。それは、iOSがイメージをUIColorにすることを可能にするのは非常に奇妙です。 – jakeboxer

+16

それは漏れるでしょう。この 'backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@" some_tile_image.png "]]、' –

1

申し訳ありませんが、そう私はここで新しい答えを作成しました:

私はちょうどKailoaによって提供された答えを指摘したいKadanoはバグがあります、image_rect.originは正しく初期化されていません。

約3週間前に、自分のコードを自分のプロジェクトにコピーしました。これは機能しているようです。しかし、昨日、iosシミュレータ(iphone 4.3)でコードを実行しようとしましたが、CGContextDrawTiledImageにハングアップしています。それが再び動作

image_rect.origin = CGPointMake(0.0, 0.0); 

: keremkの答えに示したように次の行を追加した後!

iphone 4.3シミュレータでテストした後、最近私はiPhone 4.0シミュレータでテストしましたが、昨日4.3シミュレータまたは4.2シミュレータに戻ったときに問題が発生しました。つまり、image_rect.originは定義されていません。時にはゼロのデータです。たまにランダムなデータがあることもあります。

関連する問題