CATextLayer не прокручивается - PullRequest
0 голосов
/ 20 декабря 2011

В настоящее время я пишу приложение, которое читает файл и помещает заголовки в список. При щелчке по каждому заголовку он переключается на контроллер с CATextLayer, содержащим текст, связанный с этим заголовком (обычно несколько абзацев). Первоначально я использовал UITextView, однако обнаружил, что мне нужны дополнительные параметры форматирования (а именно выравнивание по ширине), и переключился на CATextLayer.

Я читал в других вопросах здесь, что CATextLayer изначально прокручивается, однако я не могу найти, как вызвать такое поведение. Когда я попытался установить contentsRect, мой текст полностью исчезает из вида.

Это мой установочный код, который работает отдельно от прокрутки:

    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.alignmentMode = kCAAlignmentJustified;
    textLayer.string = [_data objectForKey:@"Text"];
    textLayer.wrapped = YES;
    textLayer.frame = CGRectMake(27, 75, 267, 320);
    textLayer.font = [UIFont fontWithName:@"Helvetica" size:17.0f];
    textLayer.foregroundColor = [UIColor blackColor].CGColor;
    textLayer.backgroundColor = [UIColor whiteColor].CGColor;
    [textLayer setCornerRadius:8.0f];
    [textLayer setMasksToBounds:YES]; 
    [textLayer setBorderWidth:1.0f];
    [textLayer setBorderColor:[UIColor grayColor].CGColor];
    [self.view.layer addSublayer:textLayer];
    [textLayer release];

Я просмотрел документацию для CATextLayer и множество других вопросов SO и не нашел того, что искал.

РЕДАКТИРОВАТЬ: Возможно прокрутить этот класс, однако это необходимо сделать программно, используя смещения contentsRect. Он может быть вложен в CAScrollLayer для некоторых вспомогательных функций (scrollToPoint и scrollToRect) и немного более аккуратного набора вычислений. CAScrollLayer также требует, чтобы программист обрабатывал сенсорные события, поэтому для простоты я не буду следовать этому маршруту.

Для тех, кто хотел бы пройти этот маршрут с CAScrollLayer, мой код установки изменился на следующее:

    CAScrollLayer  *scrollLayer = [[CAScrollLayer alloc] init];
    scrollLayer.frame = CGRectMake(27, 75, 267, 320);
    scrollLayer.backgroundColor = [UIColor whiteColor].CGColor;
    scrollLayer.scrollMode = kCAScrollVertically;    
    [scrollLayer setCornerRadius:8.0f];
    [scrollLayer setMasksToBounds:YES]; 
    [scrollLayer setBorderWidth:1.0f];
    [scrollLayer setBorderColor:[UIColor grayColor].CGColor];
    scrollLayer.contentsRect = CGRectMake(0, 0, 250, 350);
    scrollLayer.contentsGravity = kCAGravityCenter;

    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
    { 
        scrollLayer.contentsScale = [[UIScreen mainScreen] scale];
    }

    CATextLayer *textLayer = [[CATextLayer alloc] init];
    textLayer.alignmentMode = kCAAlignmentJustified;
    textLayer.string = [_notice objectForKey:@"Text"];
    textLayer.wrapped = YES;
    textLayer.frame = CGRectMake(5, 5, 250, 500);
    textLayer.font = [UIFont fontWithName:@"Helvetica" size:17.0f];
    textLayer.foregroundColor = [UIColor blackColor].CGColor;
    textLayer.backgroundColor = [UIColor whiteColor].CGColor;

    [scrollLayer addSublayer:textLayer];

    [self.view.layer addSublayer:scrollLayer];
    [scrollLayer release];
    [textLayer release];

1 Ответ

0 голосов
/ 21 декабря 2011

Как вы используете contentRect?Это единичные прямоугольные координаты, то есть каждый аргумент находится между нулем и единицей (включительно).

Так что, если вы хотите отобразить 50х50 под прямоугольника в точке 30, 30, вы должны сделать

textLayer.contentsRect = CGRectMake(30.0f / CONTENT_WIDTH, 30.0f / CONTENT_HEIGHT, 267.0f / CONTENT_WIDTH, 320.0f / CONTENT_HEIGHT);

Где CONTENT_WIDTH и CONTENT_HEIGHT - размер содержимого.

...