Как я могу перерисовать увеличенный текст в преобразованном UIView? - PullRequest
0 голосов
/ 07 апреля 2011

В настоящее время я реализую расширяющуюся временную шкалу.Когда я ущипну масштабирование на временной шкале, мне нужно, чтобы нарисованный текст оставался в тех же местах на UIView, на котором они нарисованы внутри UIScrollView, который обрабатывает масштабирование.(По сути, как булавки в GoogleMaps). Однако я не хочу увеличивать изображение по вертикали, поэтому я применяю преобразование путем переопределения:

- (void)setTransform:(CGAffineTransform)newValue;
{
    newValue.d = 1.0;
    [super setTransform:newValue];
}

. Это прекрасно работает, когда временная шкала зафиксирована вертикально и позволяет горизонтально расширяться.,Тем не менее, я рисую свои текстовые метки как таковые в методе, вызываемом во время setNeedsDisplay:

for (int i = 1; i < 11; i++)
{
    CGRect newFrame = CGRectMake(i * (512.0/11.0) - (512.0/11.0/2.0), self.frame.size.height - 16.0, 512.0/11.0, 32.0);
    NSString *label = [NSString stringWithFormat:@"%d", i+1];
    [label drawInRect:newFrame withFont:[UIFont systemFontOfSize:14.0]];
}

Это рисует мой текст в правильном положении в представлении прокрутки и почти идеально работает.Тем не менее, из-за моего преобразования, чтобы сохранить масштабирование статическим по вертикали, текст расширяется по горизонтали, а не по вертикали, и поэтому ужасно растягивается.Я не могу заставить текст перерисовываться с правильным соотношением сторон.Использование UILabels работает, однако я собираюсь рендерить и манипулировать свыше 1000 таких меток, поэтому я бы предпочел рисовать статические изображения в drawRect или что-то подобное.

Я пытался изменить CGRect I 'рисование текста в (стоило того), а применение CGAffineTransformIdentity невозможно, потому что я уже преобразовываю представление, чтобы предотвратить его вертикальное масштабирование.Я также пытался рисовать текст в разных видах безрезультатно, и опять же, я бы предпочел не заполнять непристойное количество объектов, если я могу этого избежать.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 02 марта 2012

Вместо применения преобразования в методе setTransform: я перехватываю масштаб, в котором оно преобразуется, и изменяю размер кадра трансформируемого вида.Код (примерно) следует:

- (void)setTransform:(CGAffineTransform)newValue;
{   
    // The 'a' value of the transform is the transform's new scale of the view, which is reset after the zooming action completes
    //  newZoomScale should therefore be kept while zooming, and then zoomScale should be updated upon completion
    _newZoomScale = _zoomScale * newValue.a;

    if (_newZoomScale < 1.0)
        _newZoomScale = 1.0;

    // Resize self
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, _originalFrame.size.width * _newZoomScale, self.frame.size.height);
}

Как упоминалось в комментариях, значение преобразования CGAffineTransform сбрасывается каждый раз, когда происходит новое действие масштабирования (однако, сохраняется дляпродолжительность действия масштабирования).Итак, я сохранил две переменные экземпляра в своем подклассе UIView (не уверен, что это невероятно элегантно, но не безумно ужасно): исходный кадр, с которым был создан вид, и «текущий» масштаб масштаба представления (дотекущее действие масштабирования).

* _originalFrame - это то, на что ссылаются для определения правильного размера теперь масштабированного кадра, и _zoomScale (масштаб представления до текущего действия масштабирования)устанавливается в значение _newZoomScale, когда обратный вызов didFinishZooming вызывается в UIScrollView, содержащем этот UIView.

Все это позволяет системе координат UIView не преобразовываться во время масштабирования, поэтому тексти т. д. могут быть нарисованы на виде без каких-либо искажений.Оглядываясь назад на это решение, я мог бы предположить, что вы также можете учесть преобразование и рисование на основе растянутой системы координат.Не уверен, что является более эффективным.У меня было небольшое беспокойство, когда я не звонил super в setTransform:, но я не заметил никаких побочных эффектов после 6 месяцев использования и разработки.

...