Запутался в свойстве фрейма UIView - PullRequest
1 голос
/ 31 марта 2010

Я создаю прототип приложения для iPad, которое рисует диаграммы. У меня есть следующая иерархия представлений:

UIView UIScrollView DiagramView: UIView TabBar Панель навигации

И подкласс UIViewController, хранящий все это вместе.

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

-(void)recalculateBounds
{
 [renderer diagram:diagram shouldDraw:NO];
 SQXRect diagramRect = SQXMakeRect(0.0,0.0,[diagram bounds].size.width,[diagram bounds].size.height);
 self.frame = diagramRect;
 [(UIScrollView*)[self superview] setContentSize:diagramRect.size];
}

Я должен раскрыть, что в кадре установлено значение 1500 x 3500, что, как я знаю, смешно. Я просто хочу сосредоточиться на некоторых других частях приложения, прежде чем приступить к оптимизации кода рендеринга.

Это прекрасно работает, за исключением того, что прямоугольник, передаваемый drawRect, не является тем размером, который я установил, и мой рисунок обрезается внизу. Это близко к размеру, который я установил, но больше по ширине и короче по высоте.

Также следует отметить тот факт, что если я заставлю фрейм быть намного больше, чем то, что, как я знаю, нужно для диаграммы, то drawRect: rect будет достаточно большим, и отсечение не произойдет. Конечно, это заставляет меня задуматься, должен ли размер кадра принимать во внимание некоторые другие свойства экрана, такие как панели инструментов, но мое чтение документов говорит мне, что кадр находится в координатах суперпредставления, что будет просмотром прокрутки, поэтому я считаю, что не делать этого нужно беспокоиться о таких вещах.

Есть идеи, что вызывает это несоответствие?

1 Ответ

4 голосов
/ 31 марта 2010

Следует соблюдать осторожность, так как максимальный размер текстуры на iPhone без 3G (и даже в Симуляторе на моем MacBook Air) составляет 2048 x 2048. Если вы попытаетесь создать вид или слой, который превышает это в любом измерении обычно он просто не отображается, или, если это так, он может быть каким-то образом обрезан. Очевидно, я не проверял это на iPad, чтобы увидеть, имеет ли он те же ограничения на размер текстуры.

Если вам нужно иметь очень большое представление, подобное этому, рекомендуемый способ для этого - использовать CATiledLayer или UIView, поддерживаемый CATiledLayer. Вы должны иметь возможность указать это в своем подклассе UIView, переопределив следующий метод:

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