Константы для контроллеров в сториборд

Joris Kluivers придумал отличное способ побороть опечатки в названии вью контроллеров и сопутствующую ошибку:

has no segue with identifier 'openPreview'
  • Загружаем питоновский скрипт и кладем его в новую папку Scripts в корне проекта.
  • Меняем в скрипте PREFIX = “jbw” на тот который вам больше подходит.
  • Открываем проект и прописываем все идентификаторы для segue и вью контроллеров.
  • Добавляем Run Script в Build Phases и настраиваем все как на скриншоте:

  • После того как скрипт отработает, появятся два файла (JBWStroyboardIdentifiers.h /.m), которые нужно прописать в префикс файле проекта (.pch)

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

Сохраняем скриншот в Camera Roll

Задача: сохранить внутренности UIScrollView как скриншот в памяти телефона.

Добавляем категорию для UIImage (Github.com – ZHAdditions).

В методе, который вызывается по нажатию кнопки вставляем:

 UIImage * screenshot = [self imageFromView: self.scrollview];  
   
 // сохраняем изначальный scrollview.frame и растягиваем scrollview по высотеширине contentSize  
 self.originalScrollviewFrame = self.scrollview.frame;  
 CGRect newFrame = self.scrollview.frame;  
 newFrame.size = self.scrollview.contentSize;  
 self.scrollview.frame = newFrame;  
 
 if (screenshot)  
     UIImageWriteToSavedPhotosAlbum(screenshot, self, @selector(thisImage:hasBeenSavedInPhotoAlbumWithError:usingContextInfo:), nil);  

В контроллере где вызывается метод кнопки вставляем чуть ниже:

 - (void)thisImage:(UIImage *)image hasBeenSavedInPhotoAlbumWithError:(NSError *)error usingContextInfo:(void*)ctxInfo {
    // меняем обратно размер scrollview
    self.scrollview.frame = self.originalScrollviewFrame;

    if (error) {
        ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];  
        if (status != ALAuthorizationStatusAuthorized)  
            // Приложению нужен доступ к фотопленке. Перейдите в настройки приватности.  
        else  
            // Произошла неизвестная ошибка, не удалось сохранить скриншот.  
    } else  
        // Готово! Скриншот сохранен.  
 }  

Подводный камень тут в том, чтобы поменять scrollview.frame перед тем как делать скриншот, иначе скриншот будет только из видимой области scrollview.

Добавляем Parallax эффект в iOS 7

Это оказалось настолько просто, что даже смешно:)

UIInterpolatingMotionEffect *xAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.x" type:UIInterpolatingMotionEffectTypeTiltAlongHorizontalAxis];
    xAxis.minimumRelativeValue = [NSNumber numberWithFloat:10.0];
    xAxis.maximumRelativeValue = [NSNumber numberWithFloat:-10.0];
UIInterpolatingMotionEffect *yAxis = [[UIInterpolatingMotionEffect alloc] initWithKeyPath:@"center.y" type:UIInterpolatingMotionEffectTypeTiltAlongVerticalAxis];
    yAxis.minimumRelativeValue = [NSNumber numberWithFloat:10.0];
    yAxis.maximumRelativeValue = [NSNumber numberWithFloat:-10.0];
UIMotionEffectGroup *group = [[UIMotionEffectGroup alloc] init];
    group.motionEffects = @[xAxis, yAxis];
    
[obj addMotionEffect:group];

добавляем группу на нужные объекты и все.

Для большего эффекта можно добавить обратные значения и прикрепить новую группу к заднему фону. В таком случае, объекты на переднем плане будут двигаться в противоположную сторону от фона.

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;
    }