12

空白の UIViewController で、次のように画面の色を変更します。

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackPattern.png"]];

次に、iPhone 5 からスクリーン キャプチャを行います。画像は次のようになります。

ここに画像の説明を入力

画像を 100% で表示すると、3 つのバー (上、左、下) が表示されます。ただし、私のパターン イメージは非常に単純です (blackPattern@2x.png):

ここに画像の説明を入力

Retina ディスプレイ用の 8x8 png です。

皮肉なことに、シミュレーターでアプリを実行すると、バーは表示されません。iPhone 5 ハードウェア固有の症状ですか?

ps 実行中の様子を見たい場合は、私のアプリをダウンロードしてください:ここから

4

3 に答える 3

2

面白い。iPhone 5で問題を再現できます(シミュレーターではなく、網膜モードでも)。

いくつかの考えと観察: 小さなパターンの画像の色は、正確に白黒 (0 と 255、それぞれ r、b、g) です。フルスクリーン画像ではそうではありません。中央は 8 と 247、下は 12 と 243、横は 4 と 251 です。

これは、補間アーティファクトのように見えます。Core Graphics が画像のピクセルをデバイス ピクセルにペイントし、ピクセルが完全に一致しない場合、隣接するソース ピクセルから補間された色を計算します。黒と白は、暗いグレーと明るいグレーになります。この場合に見られる効果です。

それでも、これがデバイスでのみ発生する理由はわかりません。

この問題を少し試してみると、理由はわかりませんでしたが、問題の解決策は見つかりませんでした: チェッカーボード パターンの色を自分で作成します。

static void patternDrawPatternCallback(void *info, CGContextRef c)
{
    for (int y = 0; y < 8; ++y) {
        for (int x = 0; x < 8; ++x) {
            CGFloat v = (x + y) & 1;
            CGContextSetRGBFillColor(c, v, v, v, 1);
            CGContextFillRect(c, (CGRect){{x, y}, {1, 1}});
        }
    }
}

static void patternReleaseInfoCallback(void *info)
{
}

static UIColor *checkerColor()
{
    CGPatternCallbacks callbacks = {
        .drawPattern = patternDrawPatternCallback,
        .releaseInfo = patternReleaseInfoCallback,
    };

    CGFloat scale = 1.0f / [UIScreen mainScreen].scale;
    CGPatternRef pattern = CGPatternCreate(NULL,
                                           (CGRect){.size={8, 8}},
                                           CGAffineTransformMakeScale(scale, scale),
                                           8, 8,
                                           kCGPatternTilingConstantSpacing,
                                           YES,
                                           &callbacks);

    CGFloat components[] = {1, 1, 1, 1};
    CGColorSpaceRef colorspace = CGColorSpaceCreatePattern(NULL);
    CGColorRef color = CGColorCreateWithPattern(colorspace, pattern, components);
    CGColorSpaceRelease(colorspace);
    CGPatternRelease(pattern);

    UIColor *checkerColor = [UIColor colorWithCGColor:color];
    CGColorRelease(color);

    return checkerColor;
}

このコードの色を使用しても、問題を再現できませんでした (パターンのタイリングで遊んで、タイルのサイズを少しずらして設定しましたが)。

于 2013-02-15T11:10:39.487 に答える
0

UIImageViewまたはUIViewを作成していて、背景が透明になっているようです。使用している画像には不透明色と透明色の両方が含まれているため、画像を通して見ることができます。

于 2013-02-19T15:13:10.420 に答える
0

これがあなたの正確な問題であるかどうかはわかりませんが、この行は次のとおりです。

self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern.png"]];

...デバイスが網膜であるかどうかに関係なく、「blackPattern.png」という名前のファイルを使用していることを意味します。行は次のようになります。

self.view.backgroundColor = [UIColor colorWithPatternImage:
    [UIImage imageNamed:@"blackPattern"]];

...(.png最後になし)。このように、プログラムは、網膜以外の場合は「blackPattern.png」を使用し、デバイスが網膜の場合は「blackPattern@2x.png」を使用します。

おそらく、このコードを実行しているシミュレーターは網膜ではないので、見た目は問題ありません。問題が発生するのは網膜デバイスだけです。

于 2013-02-14T02:18:48.857 に答える