Метод по умолчанию “UITableViewCell” позволяет отображать текст (с текстовым свойством) или изображение (со свойством изображения). А вот вывести данные в нескольких столбцах или строках не получится. В шестом уроке серии, посвященной “UITableView“, мы воспользуемся кодом предыдущего урока. Вот как будет в итоге выглядеть приложение:

Простым указанием текстового свойства для “UITableViewCell” такого результата не добиться. Чтобы решить проблему, добавим к представлению содержимого ячейки две метки. Указав соответствующие координаты, сделаем так, чтобы они выводились одна над другой. Согласно документации Apple, чтобы не менять поведения ячейки по умолчанию, объекты “subview” необходимо добавлять к представлению содержимого ячейки. Соответственно, мы не будет наследовать “UITableViewCell“. Продолжить чтение »
Еще один способ ускорить для пользователя получение данных — отображение индекса для табличного представления, о котором и пойдет речь в пятом уроке. Как обычно, воспользуемся кодом предыдущего урока. Вот как будет выглядеть итоговое приложение:
Создание индекса
Для начала нам нужно создать массив с выводимыми на экран индексными значениями. Требуемый тип значений для массива — “NSString“. Согласно документации Apple, стиль табличного представления должен быть установлен на “UITableViewStylePlain“. Однако настройка на “UITableViewStyleGrouped” ошибкой тоже не считается. Массив возвращается в методе “sectionIndexTitlesForTableView“, а код при этом выглядит так:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| //файл "RootViewController.m"
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
if(searching)
return nil;
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
[tempArray addObject:@"1"];
[tempArray addObject:@"2"];
[tempArray addObject:@"3"];
[tempArray addObject:@"4"];
[tempArray addObject:@"5"];
[tempArray addObject:@"6"];
[tempArray addObject:@"7"];
[tempArray addObject:@"8"];
[tempArray addObject:@"9"];
[tempArray addObject:@"10"];
[tempArray addObject:@"11"];
[tempArray addObject:@"12"];
[tempArray addObject:@"13"];
[tempArray addObject:@"14"];
[tempArray addObject:@"15"];
[tempArray addObject:@"16"];
[tempArray addObject:@"17"];
[tempArray addObject:@"18"];
[tempArray addObject:@"19"];
[tempArray addObject:@"20"];
[tempArray addObject:@"21"];
[tempArray addObject:@"22"];
[tempArray addObject:@"23"];
[tempArray addObject:@"24"];
[tempArray addObject:@"25"];
[tempArray addObject:@"26"];
return tempArray;
} |
Приведенный выше код создает массив и возвращает его. В массив можно добавить буквы — от ‘A’ до ‘Z’. При поиске по табличному представлению массив не возвращается, а индексное представление не отображается.
Обработка событий
При щелчке на элементе индекса выводится начинающийся с него раздел. При этом вызывается событие “tableView:sectionForSectionIndexTitle:atIndex“, возвращающее индекс отображаемого раздела. Поскольку в нашем источнике данных всего 2 раздела и 26 значений индекса, код выглядит следующим образом:
1 2 3 4 5 6 7 8
| //файл "RootViewController.m"
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
if(searching)
return -1;
return index % 2;
} |
При поиске по табличному преставлению индекс раздела не возвращается. Исходные данные немного изменены — добавлены текстовые объекты, наглядно демонстрирующие выбор раздела. Поскольку индекс выводится в непосредственной близости от вспомогательного представления, последнее устанавливается на “UITableViewCellAccessoryNone“.
Заключение
Простой реализацией двух методов мы создали для табличного представления индекс. Кстати, думаю, что некоторые методы Apple просто скрыла (например, мы не можем предложить увеличительное стекло, как в приложении с контактами). Если у кого-то есть идеи по реализации такой функции — поделитесь.
Исходный код скачать можно [здесь]
Текст оригинальной статьи на английском языке [здесь]
Уважаемые читатели, данный материал был переведен и подготовлен к публикации проектом LookApp.ru, при публикации на другом сайте ссылка на LookApp.ru обязательна.
В четвертом уроке мы освоим поиск по содержимому табличного представления, как обычно воспользовавшись кодом предыдущего урока. Вот как в итоге будет выглядеть приложение:

Добавление панели поиска
Для начала добавим к сегментированному представлению панель поиска. Двойным щелчком на файле “RootViewController.nib” откройте редактор интерфейсов Interface Builder. Перетащите в nib-файл объект “UISearchBar“. В XCode откройте файл “RootViewController.h” и задекларируйте переменную типа “UISearchBar” с названием “searchBar” и ключевым словом “IBoutlet” (для отображения в IB). Соедините переменную с объектом “UISearchBar” и настройте делегата “UISearchBar” на объект “File’s Owner“. Тем самым мы уведомляем “RootViewController” обо всех событиях, генерируемых на панели поиска. Вот как при этом будет выглядеть заголовочный файл (я добавил переменных и вспомогательный метод для поиска): Продолжить чтение »
Мы уже убедились, насколько просто отображать список элементов через табличное представление. Оказывается, выводить сгруппированные элементы ничуть не сложнее. В третьем уроке из посвященной табличным представлениям серии мы воспользуемся кодом предыдущего. Вот как будет выглядеть в итоге наше приложение:

Подготовка исходных данных
Как видим, все страны разделены на две категории: “Countries to visit” (Страны, которые нужно посетить) и “Countries visited” (Посещенные страны).
Для сгруппированной информации источник данных создается особым способом — упрощающим вывод данных. Продолжить чтение »
В этом уроке мы познакомимся с навигацией по детализированному представлению с параллельной передачей данных. Для следующей статьи серии “UITableView” воспользуемся исходным кодом из первого урока.
Создаем детализированное представление
Откройте редактор интерфейсов Interface Builder и, выполнив File -> New -> View (выберите Cocoa Touch), сохраните объект в папку приложения под именем “DetailView“. Щелчком на кнопке “Add” подтвердите добавление представления в текущий проект. Возможно, нужно будет перетащить представление (в XCode) в папку “Resources“. Обзаведясь представлением, создадим класс контроллера представления для управления им на экране. В XCode выберите “Classes” и выполните File -> New File. В разделе “iPhone OS” укажите подкласс “UIViewController“, присвоив ему имя “DetailViewController” (расширение не менять). Теперь привяжем представление к только что созданному контроллеру. В редакторе IB выделите объект “File’s Owner” и откройте окно инспектора “Identity Inspector“. Для класса “Identity” выберите тип “DetailViewController“, после чего откройте инспектор связей “Connections Inspector” и создайте связь между свойствами представления и объектом представления в nib-файле. Продолжить чтение »
В большинстве случаев, выбрав элемент из списка, пользователь загружает подробные сведения по нему в отдельном представлении. “UITableView” отвечает только за отображение списка элементов — переходы от списка к детальному представлению элемента контролирует “UINavigationController“. Таким образом, табличное представление всегда взаимодействует с контроллером навигации, и наоборот. Вот как выглядит готовое приложение:

Создание проекта
Выполнив “File -> New Project“, в разделе “iPhone OS” выберите “Navigation-Based Application“, чтобы создать новый проект XCode. Присвоив ему имя, сохраните проект (свой я назвал “TableView“). Шаблон “Navigation-Based Application” уже содержит связанные контроллер навигации и табличное представление — ручной настройки не требуется. Продолжить чтение »
В этот раз небольшое дополнение к прошлому уроку. Вернуться к основам математики меня заставили электронные письма с вопросами о том, что я имел в виду под рисованием круга и как это относится к поворотам и вращению в трехмерном пространстве.
Я начну с самого начала — с прямоугольных треугольников — и постепенно подойду к тому, как с помощью круга и треугольника осуществляется поворот в функции “gluLookAt()“. Продолжить чтение »
В Сидней практически пришла зима — и я умудрился подхватить грипп (простой, не свиной). А тут еще работа, день Матери и пр. и пр. Одним словом, ввиду недостатка времени двигаться будем быстро. Но прежде чем приступать к созданию “уникального” трехмерного мира, освоим концепции перемещения в 3D пространстве.
Нам предстоит освоить код обработки событий, который позволит ходить “по полу”. С помощью касаний мы будем поворачивать влево, вправо, перемещаться вперед и назад. Обойдемся без бега, поворотов головы и наведения резкости, хотя добавить их легко. Подобные ограничения объясняются как желанием упростить изложение, так и возможностью для не располагающих iPod Touch или iPhone добиваться аналогичных результатов в симуляторе.
Для начала загрузим основу проекта здесь.
Кода там не много — в основном объяснения, что и как происходит.
Мифическая камера
Большинство воспринимает 3D миры как пространство, на которое смотришь через камеру, но в OpenGL камеры как таковой нет. Для иллюзии движения по сцене относительно начальной точки (0, 0, 0) перемещаются объекты, а не камера, как в кино.
Процесс может показаться трудоемким, но это не так. В зависимости от приложения есть множество способов решения данной задачи и еще больше — оптимизации для действительно больших миров. На этом я вкратце остановлюсь чуть позже. Продолжить чтение »
На днях имел интересный разговор с боссом. Несмотря на то, что профессионально с OpenGL мы оба работаем примерно одинаковое время, он гораздо осведомленнее меня как в этой сфере, так и в графике в целом. Увидев мои уроки, он пошутил: «Если бы я так оценивал OpenGL, никогда бы тебя на работу не взял!».
Причиной его шутки стали мои фразы типа: “OpenGL визуализирует этот как…” или “отправьте OpenGL массив вершин”. Я, как и многие другие читатели этих уроков, прекрасно знаю, что говорить об OpenGL как о чем-то целостном — все равно настаивать на существовании Санта-Клауса. Ни в коем случае не пытаясь ввести кого бы то ни было в заблуждение, я всего лишь упрощаю подачу материала, преподнося его так, как хотел бы, чтобы объясняли мне.
Кстати, мой босс пообещал подобрать хорошую литературу для новичков, поскольку он не считает книги устаревшим артефактом. Если они мне понравятся, обязательно дам вам знать.
Впервые я столкнулся с OpenGL на моей первой работе — в исследовательском отделе государственной организации. Нам утвердили бюджет на ужасно дорогое аппаратное обеспечение от SGI, и в преддверии его прибытия меня еще с одним сотрудником срочно направили на недельные интенсивные курсы изучения OpenGL.
Первые три с половиной дня из этой недели мы не увидели ни единой строки кода. Часами обсуждались спецификации, состояния и прочая базовая информация, которая в общем и целом оказалась за исключением редких моментов невероятно скучной. Часто я просто кивал, делая вид, что все понимаю, но реально ситуация начала проясняться лишь после появления кода. Продолжить чтение »
Когда обучение в школе уже подходило к концу, в расписание закрался предмет по высшей математике, сравниться с которым по занимательности могло разве что наблюдение за сохнущей краской. Я со спокойной душой пропускал уроки, поскольку изучение столь продвинутых концепций с классом меня не вдохновляло.
Как-то раз я сидел на задней парте, размышляя о чем-то занимательном и не имея ни малейшего представления о том, что в тот день изучали. Меня это не интересовало, поскольку я знал, что могу освоить предмет, как только мне он понадобится. Но в тот день, посмотрев на доску, я был крайне удивлен, обнаружив на ней
[ a b c ] . [ d e f ]
Я так и сел. Я знал, что это математика матриц — читал об этом в литературе по графическим программам, но не совсем понял. Вдохновившись, я решил почтить урок своим вниманием и узнал массу интересного.
Вдохновение — великая вещь. Сколько ни пытался, у меня никак не получилось довести до ума урок по смешиванию (Часть 1). Поэтому я просто опубликовал его, решив вернуться к этой теме позже — когда посетит вдохновение.
Но дело в том, что изучение усложняющихся концепций OpenGL ES на примере куба и пирамиды меня вряд ли когда-нибудь вдохновит. Настало время (постепенно) увеличивать сложность сцен, с которыми мы экспериментируем — не давая иссякать вдохновению.
Наращивать сложность сцен мы будем, не спеша, давая возможность подтянуться всем желающим. Но делать это нужно, хотя бы для того, чтобы освоить управление сценами наряду с новыми концепциями OpenGL ES. Продолжить чтение »
|
Последние комментарии
Подскажите пожалуйста… Вот...
Код не открывает страницы по простой причине -...
можно было бы использовать сглаживание MSAA, графика была бы на...