Не знаете окончателния размер на рамката на UIView до след drawRect?

Чертая мрежа от данни в UIView с drawRect, чийто окончателен размер няма да знам, когато UIView бъде създаден, тъй като броят на колоните и редовете е динамичен. Разбира се, бих могъл да направя изчисленията, преди да създам UIView, но това наистина няма смисъл, защото аз също ще правя тези изчисления в подкласа UIView и предпочитам да не се налага да извличам това.

И така, как да се справя с това? Трябва ли да стартирам с много голяма рамка и да я коригирам, след като drawRect е готов?

Също така ще задам този изглед като съдържание на UIScrollView, в случай че е твърде голям, за да бъде гледан в зоната, определена за него.

Изгледът, който ще начертая, изглежда по следния начин: Ценова мрежа


person Bob Spryn    schedule 03.04.2012    source източник
comment
Вижте моя отговор на този въпрос: stackoverflow.com/a/20131528/143225   -  person Brenden    schedule 22.11.2013


Отговори (2)


  • Добавете метод във вашия изглед, който определя колко голям трябва да бъде въз основа на неговите данни. Това трябва да е отделно от drawRect:.
  • Във вашия контролер за изглед, когато настройвате изгледа, извикайте този метод, за да получите този размер.
  • След това задайте границите на изгледа и/или рамката на този размер.
  • И също така задайте изгледа за превъртане contentSize на този размер.

Ключовата концепция е: Разделете идеите за „определяне колко големи са нещата на моя изглед“ и „начертаване на нещата на моя изглед“. В момента правите изчисляването на размера, докато рисувате, но трябва да можете да го направите по-рано.

Ако искате да станете по-фантастични, можете да потърсите замяна на layoutSubviews в суперизглед на вашия изглед -- това би било добро място да проверите дали желаният размер на изгледа се е променил и след това да актуализирате размера на изгледа и contentSize на изгледа за превъртане. Но не е необходимо да правите това, за да започнете.

person Kurt Revis    schedule 04.04.2012
comment
Току-що се сетих за същото, но това, че го потвърждаваш, ме кара да мисля, че е правилно. :) Благодаря! - person Bob Spryn; 04.04.2012
comment
layoutSubviews се обажда повече от веднъж. Вижте: stackoverflow.com/a/20131528/143225 - person Brenden; 22.11.2013
comment
Да, трябва да внимавате в -layoutSubviews и да вършите работата само ако е необходимо. Ето защо казах да проверите дали желаният размер на изгледа се е променил. Ако -layoutSubviews се извика отново, но нищо не се е променило, тогава не е необходимо да правите нищо. - person Kurt Revis; 22.11.2013

Може би други имат друго решение, но мисля, че във вашия случай бих отменил setFrame: и бих извикал setNeedsDisplay, така че drawRect да бъде извикан, след като вашата рамка се промени. Опитвали ли сте вече този подход?

person clstroud    schedule 03.04.2012
comment
Хм.. това изглежда малко хакерско. Ще изчакам малко да видя какви други предложения ще излязат. Благодаря! - person Bob Spryn; 04.04.2012
comment
Може би... но вярвам, че очаквате да работи повече като layoutSubviews, който се извиква всеки път, когато рамката се промени. drawRect ще бъде извикан само когато нещо конкретно го помоли да рисува отново изгледа. - person clstroud; 04.04.2012
comment
Друго нещо обаче, използвате ли init или initWithFrame: за инициализиране на вашия персонализиран UIView? - person clstroud; 04.04.2012
comment
Все още не използвам нито едно от двете. Бях объркан как да се справя с това, когато не познавам рамката си като начало. - person Bob Spryn; 04.04.2012
comment
А, добре, така че ако изобщо не знаете рамката на изгледа, когато създавате екземпляр, все още мисля, че единствените ви опции ще бъдат да извикате setNeedsDisplay от заменен setFrame: или може би да го извикате от метода layoutSubviews на контролера на родителския изглед (не се препоръчва) . Иначе ми е любопитно да видя какво ще предложат другите! - person clstroud; 04.04.2012