пятница, 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__);

четверг, 14 мая 2009 г.

Иконка приложения

Каждое приложение имеет свою иконку на рабочем столе iPhon-a

Чтобы установить эту картинку, надо в файле info.plist прописать имя картинки для параметра Icon file

Чтобы убрать с иконки уродливую полукруглую тень, надо в  файле info.plist добавить параметр UIPrerenderedIcon типа boolean и установить его значение в YES