Ошибка при обновлении cocoaPods

30 января был найден баг в libgit2 и у всех конфигурация подов сломалась.
При попытке выполнить pod update появлялась ошибка про merge conflict.

 

Решение:

$ pod repo remove master
$ pod setup

подробнее об ошибке можно почитать на офиц блоге.

Навигация в сториборд

Бывает в сторибордах очень тяжело попасть или выбрать UIView, в котором какой-либо элемент растянут на всю ширинувысоту. На выручку приходит Tab. При нажатии фокус перейдет на след элемент в иерархии и так по кругу.

Swipe back без uinavigationbar

 Если нужно поддерживать жест смахивания от левого края (swipe from left edge to go back), но uinavigationbar скрыт, то включается функционал следующим трюком:

    if ([navController respondsToSelector:@selector(interactivePopGestureRecognizer)])
    {
        navController.interactivePopGestureRecognizer.enabled = YES;
        navController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
    }

Добавляем к Long Press Gesture Recognizer drag’n’drop

Вот выдержка из документации по UILongPressGestureRecognizer:

Long-press gestures are continuous. The gesture begins (UIGestureRecognizerStateBegan) when the number of allowable fingers (numberOfTouchesRequired) have been pressed for the specified period (minimumPressDuration) and the touches do not move beyond the allowable range of movement (allowableMovement). The gesture recognizer transitions to the Change state whenever a finger moves, and it ends (UIGestureRecognizerStateEnded) when any of the fingers are lifted.

Таким образом всю логику по передвижению view можно вставить в UIGestureRecognizerStateChanged.

- (void)longPressDetected:(UILongPressGestureRecognizer*)sender
{
    if (sender.state == UIGestureRecognizerStateBegan)
    {
        [UIView animateWithDuration:0.2 animations:^{
          sender.view.transform = CGAffineTransformMakeScale(1.3, 1.3);
        }];
    }
    else if (sender.state == UIGestureRecognizerStateChanged)
    {        
        CGFloat finalX = [sender locationInView:self].x;
        CGFloat finalY = [sender locationInView:self].y;
        
        int border = 60;

        if (finalX < CGRectGetMinX(self.bounds) + border)
            finalX = CGRectGetMinX(self.bounds) + border;
        else if (finalX > CGRectGetMaxX(self.bounds) - border)
            finalX = CGRectGetMaxX(self.bounds) - border;

        if (finalY < CGRectGetMinY(self.bounds) + border)
            finalY = CGRectGetMinY(self.bounds) + border;
        else if (finalY > CGRectGetMaxY(self.bounds) - border)
            finalY = CGRectGetMaxY(self.bounds) - border;
        
        
        sender.view.center = CGPointMake(finalX, finalY);
    }
    else if (sender.state == UIGestureRecognizerStateEnded)
    {
        [UIView animateWithDuration:0.2 animations:^{
          sender.view.transform = CGAffineTransformMakeScale(1.0, 1.0);
        }];
    }
}

почему-то я раньше не обращал на это внимание и делал это двумя разными рекогнайзерами… 

Упрощяем перевод приложения на другие языки

Katsuma Tanaka (questbeat) разработал удобный плагин для Xcode, который добавляет автокомплит для NSLocalizedString.

Выглядит это вот так:

 Работает как часы и сильно упрощает жизнь.

Более подробное описание и инструкция по установке вот тут: questbeat/Lin 

для Xcode 5: questbeat/Lin-Xcode5

Быстрое удаление Derived Data

Deisa Mason сделала отличный плагин для Xcode, позволяющий одной кнопкой быстро удалить Derived Data из проекта. Это достаточно просто сделать и с помощью терминала, но так, безусловно, быстрее.

Инструкция по установке.

 

Упрощаем работу с UIColor

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

#define RGB(r, g, b) 
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1];
#define RGBA(r, g, b, a)
[UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:a];