вторник, 13 июля 2010 г.

Второе издание замечательной книги The iPhone Developer's Cookbook Автор Эрика Садун.

Обязательно к прочтению. PDF 12 мб

The iPhone Developer's Cookbook: Building Applications with the iPhone 3.0 SDK

пятница, 18 сентября 2009 г.

Остановить ScrollWiew

Содержимое UIscrollView может двигаться по инерции, если его резко "запустить" пальцем. Но что, если это движение надо резко остановить? Делается это так:

[scrollView scrollRectToVisible:CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y + 0.01, scrollView.frame.size.width, scrollView.frame.size.height) animated:NO];

Все 

пятница, 28 августа 2009 г.

Контроль ввода текста с клавиатуры

Довольно часто нужно знать и контролировать те данные, что пользователь вводит в текстовые поля. Причем контролировать непосредственно в процессе ввода. Это вполне возможно. 

И UITextView и UITextField шлют системе уведомления о изменении своего состояния (UITextViewTextDidChangeNotification и UITextFieldTextDidChangeNotification ). Шлют они их, используя NSNotificationCenter.  Все что нам нужно, это слушать этот NotificationCenter и реагировать на нужные нам уведомления. 

Пара слов о работе с NSNotificationCenter
NSNotificationCenter *notCenter = [NSNotificationCenter defaultCenter];  
Это ссылка на NotificationCenter, через который по умолчанию ходят все системные сообщения (в том числе и нужные нам)  

[[NSNotificationCenter defaultCenter]postNotificationName: @"NAME_OF_NOTIFICATION" object: self];  
Так можно отправлять уведомления. Как видно, уведомление имеет имя и ссылку на объект (обычно это объект отправивший уведомлене). То есть мы можем видеть кто и какое уведомление отправил. В нашем случае мы будем только ловить уведомления, отправленные текстовыми полями

[[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(meth:) name:@"UITextViewTextDidChangeNotification" object: nil];
Регистрируем слушателя уведомлений. Рассмотрим все 4 параметра 
addObserver: Объект, который будет реагировать на уведомления
selector:  селектор (метод) объекта, который будет вызван при приходе уведомления
name: строка-имя уведомления, которое мы ждем
object: объект, уведомления от которого мы ждем. Если nil, то принимаем уведомления от любого объекта.

- (void)meth:(NSNotification*)notification;
Так выглядит метод(selector:), который будет вызван при приходе уведомления

Ну и наконец-то возвращаемся к теме статьи. Небольшой пример. Класс, который будет менять буквы, вводимые в любом текстовом поле приложения на ПРОПИСНЫЕ

-(id) init {
   if(self = [super init]) {
       [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(capitalizeText:)              name:@"UITextFieldTextDidChangeNotification" object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(capitalizeText:) name:@"UITextViewTextDidChangeNotification" object:nil];
 }
 return self;
}

-(void) capitalizeText: (NSNotification*)notification{ 
 [[NSNotificationCenter defaultCenter]removeObserver: self name: [notification name] object: nil];
 UIView *textItem = [notification object]; // textField or textView
 NSString *text = [textItem text];
 text = [text uppercaseString];
 [textItem setText: text];
 [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(capitalizeText:) name:[notification name] object:nil];
}


- (void) dealloc
{
 [[NSNotificationCenter defaultCenter]removeObserver: self name: @"UITextFieldTextDidChangeNotification" object: nil];
 [[NSNotificationCenter defaultCenter]removeObserver: self name: @"UITextViewTextDidChangeNotification" object: nil];
 [super dealloc];
}


Обратите внимание на то, что уведомление  xxxTextDidChangeNotification будет слаться и при программном изменении текста в текстовом поле. поэтому мы в методе capitalizeText: временно отключаам наблюдение.

Все. Будут вопросы-предложения-комментарии - пишите ))


четверг, 13 августа 2009 г.

CGPoint, CGRect, CGSize переводим в NSString

Очень часто (особенно при отладке) необходимо выводить в консоль CGPoint, CGRect и CGSize. Чтоб не писать громоздкие конструкции, воспользуйтесь функциями

NSStringFromCGPoint(CGPoint point);

NSStringFromCGRect(CGRect rect);

NSStringFromCGSize(CGSize size);

CGRect rect = CGRectMake(1, 2, 3, 4);
 NSString *s = NSStringFromCGRect(rect);
 NSLog(s);


Так же есть и обратные функции CGPointFromString, CGRectFromString, и CGSizeFromString

пятница, 10 июля 2009 г.

Cоздание UIView cпомощью Interface Builder

Иногда хочется создать вью в интерфейс билдере, а потом в процессе работы загрузить и показать его. Делается это просто:

1. Создаем в проекте класс - наследник UIView (например myView)

2. Создаем в IB вью, кладем на него все что пожелаем и в инспекторе на последней закладке указываем имя нашего класса (myView)

3. Сохраняем и подключаем к проекту (например с именем myViev.xib)

4. Теперь чтобы в проекте вызвать созданый вью пишем:

 myView *view = [[[NSBundle mainBundle] loadNibNamed:@"myViev" owner: self options:nil] objectAtIndex:0];

Все можно пользоваться этим вью как угодно )))

вторник, 23 июня 2009 г.

вторник, 9 июня 2009 г.

Дебаг

Выводим имя файла, номер строки, имя класса и метода в консоль

NSLog(@"%s === %d === %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);