1 октября 2011 г.

UIGestureRecognizer перехват одиночного касания и двойного на одном UIView

Для навешивания событий для одиночных и двойных касаний очень удобо использовать класс UIGestureRecognizer. Но если нужно перехватывать события которые пересекаются (например одиночное касание и двойное), то может возникнуть ситуация, что всегда будут выполнятся два перехваченных события (при двойном тапе будет всегда вызываться событие одиночного тапа).

В этом случае нужно запретить в UIGestureRecognizer одиночного тапа посылку события при двойном тапе. Делается просто методом - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer.

Пример:
        UIGestureRecognizer *doubleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                initWithTarget:self action:@selector(handleDoubleTap:)];
        doubleTapGestureRecognizer.numberOfTapsRequired = 2;
        [self addGestureRecognizer:doubleTapGestureRecognizer];

        UIGestureRecognizer *singleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                                              initWithTarget:self action:@selector(handleSingleTap:)];
        singleTapGestureRecognizer.numberOfTapsRequired = 1;
        [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGestureRecognizer];
        [self addGestureRecognizer:singleTapGestureRecognizer];

8 сентября 2011 г.

Отключение ARC в xCode 4.2

Нужно всего лишь в качестве компилятора в свойствах проекта выбрать "LLVM GCC 4.2" вместо установленного по умолчанию "Apple LLVM compiler 3.0".



PS: По совету твиттер пользователя @iLeNsTR можно обойтись флагами компилятора:

17 августа 2011 г.

Обработка файлов: групповая замена

Довольно часто поражаюсь, как все в консоли бывает просто реализовать. Вот сегодня мне понадобилось обработать довольно много html, и заменить в них символ "®" на его html-код "&amp#174;", внезапно консоль пришла на помощь):
$ (find . -name *html) | xargs sed -i "s/®/\®/g"

14 июля 2011 г.

Конвертирование plist в бинарный формат (bplist) и обратно в текстовый

Да, мне кажется, что задача бессмысленна, так как методы чтения plist-ов ([NSDictionary dictionaryWithContentsOfFile:(NSString *)path]) одинаково хорошо понимают, что plist в бинарном формате, что в текстовом. Но все ж возникла задача отдать на редактирование plist третьей стороне для редактирования в текстовом редакторе, а для этого пришлось сконвертировать plist в текстовый формат. Итак, в терминале выполняем команду:
$ plutil -convert xml1 ./myBinaryPlist.plist 
и назад из текстового в бинарный:
$ plutil -convert binary1 ./myTextPlist.plist 

17 июня 2011 г.

Запрет лока экрана при запущенном приложении в iOS

[UIApplication sharedApplication].idleTimerDisabled = YES;

Рисование под статус баром в iOS

Полезно иногда просматривать официальную документацию.

В моем приложении, так-же как и в стандартном Photos необходимо убирать статус бар при тапе на экран, но так, что б вью на экране не "прыгало". Думал уже реализовывать кастомным вью и непосредственно добавлять его на UIWindow, но нашел замечательное свойство wantsFullScreenLayout у UIViewController, которое все проблеммы решило.

9 мая 2011 г.

Размытый текст в UILabel

Я не привык пользоваться Interface Builder в xCode. Все компоненты создаю динамически и для меня это вполне удобно. И вот недавно столкнулся с проблемой отображения текста в компоненте UILabel, а поскольку это "корневая" компонента входящая в такие компоненты как UIButton и UITableViewCell, то проблема оказалась серьезной.

Итак, на скриншоте ниже отображены UILabel с одним шрифтом и одним и тем-же размером.



Вторая метка выглядит размытой. Вот код, которым я создавал эти UILabel.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
 CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
    
    UILabel *normal = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 30.0, screenRect.size.width, 50.0)];
    normal.text = @"Test label1";
    normal.textAlignment = UITextAlignmentCenter;
    normal.font = [UIFont systemFontOfSize:16.0];
    normal.backgroundColor = [UIColor clearColor];
    [self.window addSubview:normal];
    [normal release];
    
    
    UILabel *fuzzy = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 60.55, screenRect.size.width, 50.0)];
    fuzzy.text = @"Test label2";
    fuzzy.textAlignment = UITextAlignmentCenter;
    fuzzy.font = [UIFont systemFontOfSize:16.0];
    fuzzy.backgroundColor = [UIColor clearColor];
    [self.window addSubview:fuzzy];
    [fuzzy release];
    
    
    [self.window makeKeyAndVisible];
    return YES;
}
Решилось все просто, оказывается UILabel не дружит с нецелыми координатами (60.5 - в CGRectMake(0.0, 60.5, screenRect.size.width, 50.0))