3

いくつかのカスタムセルを含むグループ化されたテーブルビューと、各セルのbackgroundColorとしての画像を使用しています。

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"custombackground.png"]];

これまでのところ、すべて良好ですが、私の画像は通常のセルの高さよりもかなり高いため、画像の上部のみが背景として使用されており、各セルは同じです。基本的に、それは各セルがパターンを繰り返すことでずさんなように見えます。

誰かがこれを行ったので、セクションの2行目は画像の次の部分を繰り返すのではなく表示し、単一の連続画像のように見えますか?(たとえば、行0は画像の最初の44ポイントを使用し、行1はポイント45-88を使用します。)

それは可能ですか、および/またはその方法についてのアイデアはありますか?

4

2 に答える 2

1

はい、できます。この問題の鍵は、UIImage の CGImage メソッドを使用してから、Quartz の「CGImageRef CGImageCreateWithImageInRect();」を使用することです。サブイメージを作成します。CGImageRef を使用すると、新しい UIImage を作成できます。

ですから、問題は高さだけだとしましょう。最初のセルは、上から "h" ピクセルの部分画像を使用します。次に、次は「h」で始まり、さらにhピクセルになります。

Quartz は「反転した」座標系を使用するため、サブイメージを取得する場所を正確にいじる必要があることに注意してください。これを行うときは、常に微調整が必​​要なように思われるので、最後に少し時間をかけて適切に表示することを期待してください.

于 2012-07-15T21:14:24.460 に答える
0

各行の部分サイズは indexPath.row 変数で計算できます。その後、計算した CGRect 値で画像をトリミングします。

CGFloat top = (indexPath.row == 0) ? 0 : (indexPath.row * 44) + 1;

CGRectMake(0, top, 320, 44);画像をトリミングするための四角形です

この回答を使用して、UIImage をトリミングできます。

OP編集:ありがとう!提案から思いついたことを追加します。

    UIImage *image = [UIImage imageNamed:@"custombackground.png"];
    CGFloat y = indexPath.row * 44;

    for (y; y+44 > image.size.height; y -= image.size.height);
    //Sends our y origin back to the top of the image in case
    //the image would have ended in the middle of a cell, so 
    //it can be used for any length of table.

    CGRect cropRect = CGRectMake(0, y, 320, 44);
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);

    cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithCGImage:imageRef]];
于 2012-07-15T21:08:34.827 に答える