Подтвердить что ты не робот

Странный цветWithPatternImage на iPhone 5

В пустом UIViewController я меняю цвет экрана на:

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

Затем я делаю захват экрана с моего iPhone 5. Изображение выглядит так:

enter image description here

Если вы просмотрите изображение на 100%, вы увидите три бара (сверху, слева и внизу). Однако мой образ рисунка очень прост ([email protected]):

enter image description here

Это 8x8 png для отображения сетчатки.

По иронии судьбы, бары не видны, когда приложение запускается на симуляторе. Является ли это специфическим для Symantom аппаратным обеспечением iPhone 5?

p.s. Если вы хотите его запустить, вы можете загрузить мое приложение: здесь

4b9b3361

Ответ 1

Интересно. Я могу воспроизвести проблему на 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;
}

Используя цвет из этого кода, я не смог воспроизвести проблему (даже если я играл с черепицей рисунка и немного уменьшил размер плиток).

Ответ 2

Я не знаю, является ли это вашей конкретной проблемой, но эта строка:

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

... означает, что вы используете файл с именем "blackPattern.png", является ли устройство сетчаткой или нет. Строка должна быть:

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

... (без конца .png). Таким образом, ваша программа будет использовать "blackPattern.png", если не сетчатка и "[email protected]", если устройство является сетчаткой.

Вероятно, симулятор, на котором вы запускаете этот код, не является сетчаткой, так что это выглядит хорошо; это только устройство сетчатки, что вы видите проблему.

Ответ 3

Похоже, вы создаете UIImageView или UIView и с прозрачным фоном. Поскольку изображение, которое вы используете, содержит как непрозрачные, так и прозрачные цвета, вы все равно можете видеть его.