Advanced iOS Programming

Получил по почте новости от сайта Big nerd Runch, про который я писал, что мне нравятся их книги. Увидел ссылку на их новый класс Advanced iOS Programming. Немного прифигел от ценничка в $4050, но вот программа мне очень понравилась. Поэтому я решил сам себя подтянуть прямо по ней по списочку.

  • Store documents, application data, and settings in iCloud
  • Write concurrent applications using Grand Central Dispatch and NSOperationQueue
  • Customize Storyboard view transitions
  • Use GLKit based controllers for OpenGL 3D rendering
  • Process and enhance images using Core Image and OpenGL ES shaders
  • Efficiently process data sets with the Accelerate framework
  • Asynchronously communicate with and parse data from JSON based web services
  • Post to Twitter and authenticate with other web services using the Twitter framework
  • Access the accelerometer, gyroscope and compass using Core Motion
  • Write Augmented Reality applications that place virtual markers on real-world objects
  • Record, process and playback audio in real time using Core Audio
  • Display and process real time video in OpenGL ES
  • Display content on external displays using AirPlay streaming and wired video connections
  • Use web views to render content and pass information and events between Javascript and Objective-C
  • Master the iOS performance optimization tools and LLDB debugger
  • Secure files on disk and credentials in the keychain

Начал с iCloud. Если что-то интересное по этим темам будет, то буду делиться 🙂

Реклама

Книги по программированию для iOS. Часть 2

Вы возможно знаете, а возможно нет, что есть такая всемирно известная женщина-программист Эрика Садун (Erica Sadun). Она является постоянным автором популярного блога о TUAW.com А также постоянно пишет книги: начиная от сугубо «пользовательских», заканчивая серьезными книгами для программистов. 24 ноября выходит уже третье издание ее книги iOS Developer’s Cookbook — на этот раз The iOS 5 Developer’s Cookbook: Core Concepts and Essential Recipes for iOS Programmers. Кстати вот так коллеги представили Эрику на постере iPhone Wars.

Эта книга мне тоже очень нравится, хотя признаюсь целиком я ее не читал, да и не пытался. Потому что ее название — Cookbook, то есть поваренная книга. По сути это большой сборник рецептов, совершенно независимых друг от друга. Когда вам надо узнать как сделать кастомную клеточку в UITableView или написать метод определяющий скорость по GPS, как рисовать пальцем на экране, как проверить доступность сети в данным момент и еще сотни готовых рецептов. По каждому из них есть sample code, который вы можете скачать. Много примеров вообще написаны в виде всего одного файла кода в main.m чтобы не загружать вас деталями и не отвлекать от сути дела. Очень много трюков я почерпнул именно из этой книги. Ведь порой, когда ты изучаешь что-то новое, ты видишь готовый продукт и думаешь: «Хм… как это было сделано и как мне это повторить». Так вот Эрика отвечает на эти вопросы. Когда раньше я сталкивался с проблемой реализации какой-то идеи, то первым делом я лез в эту книгу.

Но сразу хочу оговориться, что это книга, как мне кажется, не для начинающих, хотя там и есть главы типа «Твой первый проект». Ее лучше всего использовать именно как книгу рецептов, когда вы знаете, что вы хотите, но не знаете КАК. Вот здесь вы можете посмотреть оглавление прошлого издания книги. Все примеры книги Эрика хранит всегда на github, и хотя новая книга еще не вышла, то код к ней уже давно там лежит.

Ну и на «сладкое»… как вы знаете в iOS 5 появился новый UIPageViewController — контроллер, который красиво переворачивает странички. И хотя Apple почему-то написали, что этот класс не предназначен для создания подкласса, Эрика наплевала на это и создала пример в своей новой книге и рассказала, как быстро и просто создать приложение с этим новым контроллером. Мне удалось меньше чем за час адаптировать его для своих нужд и сделать простенький фотоальбомчик. Поэтому если вам интересно, как использовать новый  UIPageViewController, то  попробуйте и вы — это просто! Примечательно, что какой-то человечек, прокомментировал этот код, сказав, что же вы делаете, Apple же не рекомендует так делать. На что Эрика ответила: «Спасибо, что вы поделились своим мнением» 🙂 Вот такая она, эта Эрика.

Совместимость с iOS 5. Часть 2

В другом приложении, в котором я участвовал, а именно iPif, я поставил на экран загрузки списка пифов элемент UIActivityIndicator. Я не знаю, чем я руководствовался тогда, но я поставил его на белый фон UITableView со свойствами Large White Activity Indicator. Но в iOS 4 все выглядело прекрасно. Реально все выглядело как серый индикатор активности на белом фоне, поэтому я не заметил ничего подозрительного. Однако установив программу на iOS 5, я увидел, что индикатор пропал, и пользователь больше не имеет возможности знать идет закачка списка или нет. Я начал разбираться в вопросе, и когда узнал в чем дело, то стал практически прыгать от радости. Все дело в том, что Apple наконец сделал возможность присваивать цвет этому индикатору. Теперь он может быть хоть зеленый, хоть красный и хоть серобуромалиновый. Но если цвет не задан, то в таких местах, где белое на белом — его теперь действительно не видно. Что же надо теперь сделать, чтобы решить проблему. Например, мы можем задать в iOS 5 серый цвет индикатора, но тогда при запуске iOS 4 наше приложение упадет, так как в 4-ой версии этого нет. Многие программисты начинают выискивать версию iOS, на которой сейчас работает человек и вызывать методы в зависимости от номера версии. Apple выступает категорически против этого. Для этого есть очень простой метод: мы проверяем отвечает ли наш объект на setColor, если да — то это iOS 5 и выше, и мы присваиваем нужный нам цвет. Если же не отвечает, то оставляем все как есть. Вот пример кода:


if ([loading respondToSelector:@selector(setColor:)]) {
    [loading setColor:[UIColor lightGrayColor]];
}

Все, теперь мой UIActivityIndicator прекрасно отображается на всех версиях.

Совместимость с iOS 5. Часть 1.

Я начал программировать на iPhone OS (iOS) как раз в то время, когда шел переход с 3-ей версии на 4-ую. Готовых программ у меня еще тогда не было, поэтому вопросы совместимости меня не особо волновали. В этом месяце Apple выпустила iOS 5, и мы все на своих устройствах могли заметить, что очень многие программы не работали, работали плохо и работают плохо по сей день на этой версии операционной системы. В следующих нескольких постах я рассмотрю на примере своих приложений, как справляться с некоторыми проблемами совместимости и более того, как надо было писать, чтобы этих проблем не было вовсе.

В моем приложении AstroFriends у меня сделан свой UINavigationBar в цвет фона.

Однако на iOS 5 он начал показываться вот так. Не очень красиво, правда.

Все дело оказалось в том, что начиная с 5-ой версии Apple не будет вызывать drawRect, если вы не создали подкласс к элементам дизайна UINavigationBar, UIToolbar, and UITabBar. А это значит, что метод, который работал ранее, а именно создание новой категории и переопределение метода drawRect, теперь не будет работать. Вот полное разъяснение от Apple:

In iOS 5, the UINavigationBar, UIToolbar, and UITabBar implementations have changed so that the drawRect: method is not called unless it is implemented in a subclass. Apps that have re-implemented drawRect: in a category on any of these classes will find that the drawRect: method isn’t called. UIKit does link-checking to keep the method from being called in apps linked before iOS 5 but does not support this design on iOS 5 or later.

а вот метод, который прекрасно работал ранее в iOS 4. Если ты спрашивал на форумах: «Как сделать свой UINavigationBar со своим дизайном», то везде получал ответ:


@interface UINavigationBar (TransparentAdditions)
@end

@implementation UINavigationBar (TransparentAdditions)

- (void)drawRect:(CGRect)rect {
     UIImage *image = [UIImage imageNamed: @"af_nav_background.png"];
     [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

Теперь мы знаем, что исправить проблему будет очень просто, если мы просто сделаем подкласс MyNavigationBar от UINavigationBar.


#import <Foundation/Foundation.h>

@interface MyNavigationBar : UINavigationBar

@end

#import "MyNavigationBar.h"

@implementation MyNavigationBar

- (void)drawRect:(CGRect)rect {
      UIImage *image = [UIImage imageNamed: @"af_nav_background.png"];
      [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

@end

Теперь нам осталось указать в Interface Builder-е, что в Navigation Bar мы будем использовать наш custom class.

Запускаем приложение и видим, что теперь оно правильно отображается и в старой iOS 4, и в новой iOS 5. То есть теперь, если вы хотите сделать собственный дизайн таких элементов как UINavigationBar, UIToolbar, and UITabBar, вам надо создать свой подкласс этих элементов управления и уже там определять их внешний вид. Кстати, если раньше, переопределяя метод drawRect  мы получали все Navigation Bar в приложении одного вида, то теперь мы имеем возможность менять их по своему усмотрению.