CATextLayer не прокручивается
В настоящее время я пишу приложение, которое читает файл и помещает заголовки в список. При щелчке по каждому заголовку он переключается на контроллер с 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 ответ
Как вы используете contentRect? Это единичные прямоугольные координаты, то есть каждый аргумент находится между нулем и единицей (включительно).
Поэтому, если вы хотите отобразить 50 x 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 - это размер содержимого.