Как изменить фазу шаблона при использовании [UIColor colorWithPatternImage:]?

Я использую [UIColor colorWithPatternImage:] для установки фонового изображения для моего сгруппированного UITableViewCell. Я получил свободный закругленный угол для своих ячеек, и все выглядит отлично, пока я не попытаюсь придать ячейке другую высоту.

В идеале я хочу, чтобы фоновое изображение было центрировано по вертикали, но метод colorWithPatternImage: запускает шаблон изображения из нижнего левого угла, из-за чего моя ячейка выглядит плохо.

В документации сказано, что

"По умолчанию фаза возвращаемого цвета равна 0, что приводит к выравниванию верхнего левого угла изображения с исходной точкой рисунка. Чтобы изменить фазу, сделайте цвет текущим, а затем используйте CGContextSetPatternPhase. изменить фазу."

Но я понятия не имею, как использовать CGContextSetPatternPhase с моей текущей реализацией.

Я пытался

- (void)drawRect:(CGRect)rect 
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSaveGState(context);

    CGSize phase = CGSizeMake(50, 50);
    CGContextSetPatternPhase(context, phase);

    UIImage* image = [UIImage imageNamed:@"cell_background"];

    UIColor* color = [UIColor colorWithPatternImage:image];

    self.backgroundColor = color;

    CGContextRestoreGState(context);

    [super drawRect:rect];
}

Но это никак не влияет на фазу паттерна. Может ли кто-нибудь сказать мне, как я могу его использовать?

Большое спасибо,

Джозеф


person Joseph Lin    schedule 06.07.2011    source источник


Ответы (1)


Вызовы Core Graphics обычно используются как часть определенного процесса рисования; установка свойства backgroundColor на самом деле ничего не отрисовывает, она просто устанавливает, как представление отрисовывает себя по умолчанию. В Руководстве по программированию Quartz 2D есть объяснение того, как рисовать с помощью изображений шаблонов; можно сократить путь через

CGColorRef color = [UIColor colorWithPatternImage:image].CGColor;
CGContextSetFillColorWithColor(context, color);
CGContextFillRect(context, self.bounds);

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

person Noah Witherspoon    schedule 06.07.2011
comment
Спасибо, Ной, это действительно меняет фазу паттерна. К сожалению, это не относится к моей ситуации, так как drawRect: рисует самый задний слой ячейки, и я потерял закругленный угол и прочее. Но я думаю, что я должен открыть еще один вопрос для этого. - person Joseph Lin; 07.07.2011