CATiledLayer для рисования гигантского UIView с кнопками?

У меня есть этот гигант UIView с примерно 600 UIButtons в качестве подвидов. Размер UIView составляет примерно 2000 на 2000 пикселей, и это подвид самого себя для UIScrollView. Я пытаюсь реализовать CATiledLayer в качестве слоя рендеринга для этого гигантского UIView, но не могу понять, как рендерить тайлы. Я нашел много примеров, которые охватывают CATiledLayer с мозаичными изображениями, pdf, ... но я никогда не нашел реального примера того, как рисовать полный UIView с большим количеством подпредставлений. Вы, наверное, спросите, почему я хотел бы придерживаться UIView? Потому что я бы хотел, чтобы пользователи продолжали использовать кнопки для взаимодействия с представлением.

Мне интересно, есть ли у кого-нибудь пример или какой-то псевдокод о том, как реализовать метод - (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context, имея в виду, что есть 1 гигантский UIView с большим количеством UIbuttons в качестве его подвидов.


person polyclick    schedule 27.04.2011    source источник


Ответы (1)


Начиная с iOS 4.0 вы можете использовать drawRect: вместо drawLayer:inContext:. Этот вопрос и ответ от Apple объясняет это: http://developer.apple.com/library/ios/#qa/qa1637/_index.html. Важным моментом является то, что drawRect: in 4 теперь является потокобезопасным, и вы можете использовать графические функции UIKit.

Вам все еще нужно переопределить этот метод, чтобы использовать CATileLayer:

+(Class)layerClass
{
    return [CATiledLayer class];
}

Но теперь вы можете просто использовать drawRect:

-(void)drawRect:(CGRect)rect
{
    //normal drawing routines here.
}

Прямоугольник, который передается методу, будет размером с ваши плитки, и вам нужно определить, что нужно нарисовать в конкретном прямоугольнике. Сила CATiledLayer заключается в том, что он требует отрисовки только плиток, которые отображаются на экране. Он также использует фоновые потоки и работает очень быстро.

Я не использовал CATiledLayer с UIViews, только большие изображения. Имеются ли подклассы UIViews со своими собственными реализациями drawRect:? Я думаю, вам нужно будет определить, какие представления будут отображаться в текущем прямоугольнике, и вызвать их метод drawRect:.

Использование drawRect: возможно только для iOS 4.0 и более поздних версий, оно не будет работать для более старых версий.

person EricK    schedule 28.04.2011
comment
Спасибо за объяснение, но я разрабатываю версию 3.2 или выше для iPad, так что это еще не ответ на мой вопрос. В любом случае, большой голос за информацию! - person polyclick; 29.04.2011
comment
Я написал небольшое демонстрационное приложение, прежде чем ответить с помощью iOS 4. Я переделаю его для 3.2, как только у меня будет возможность. - person EricK; 29.04.2011
comment
Извините, что поднимаю старый вопрос, но удалось ли вам заставить это работать в версиях до 4.0? - person sradforth; 26.08.2012