четвер, 8 жовтня 2015 р.

Симуляция 3D Touch в xCode 7.1 beta

Как известно, в новом iPhone 6s появилась технология 3D Touch. Одно из её применений - Quick actions - специальное меню, с помощью которого можно выполнить быстрый доступ к какой-нибудь функции приложения. К сожалению, симулятор Xcode 7.1 beta пока что не позволяет симулировать эту технологию. Но, все не так уж сумрачно вблизи (с), с помощью волшебного cкрипта можно эмулировать вызов Quick actions. После установки скрипта, для вызова Quick actions следует отправить app’s bundle identifier на порт 8000, например, с помощью ncat:

echo 'net.naan.TwitterFonPro' | nc 127.0.0.1 8000

Скриншот симулятора:

Так что можно разрабатывать поддержку новых фич приложения, не дожидаясь реального девайса.

вівторок, 16 червня 2015 р.

Тонкости crop’а UIImage

Иногда возникает необходимость вырезать часть изображения из UIImage (сделать crop). Обычно используется следующий подход:

- (UIImage)cropInRect:(CGRect)cropRect {
    CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, cropRect);
    UIImage cropped = [UIImage imageWithCGImage:imageRef scale:1. 
        orientation:self.imageOrientation];
    CGImageRelease(imageRef);
    return cropped;
}

Однако здесь есть одна проблема: данный метод работает только для изображений в обычной ориентации. Если же изображение повернуто, то будет вырезана не совсем правильная часть. Оригинальное изображение:

Вырезанная часть:

Тонкость состоит в том, что необходимо трансформировать координаты вырезаемой части в зависимости от ориентации изображения:

- (UIImage)cropInRect:(CGRect)cropRect {
    CGAffineTransform rectTransform;
    switch (self.imageOrientation) {
        case UIImageOrientationLeft:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI_2), 
                    0, -self.size.height);
            break;
        case UIImageOrientationRight:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI_2), 
                    -self.size.width, 0);
            break;
        case UIImageOrientationDown:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI), 
                    -self.size.width, -self.size.height);
            break;
        default:
            rectTransform = CGAffineTransformIdentity;
    };
    rectTransform = CGAffineTransformScale(rectTransform, self.scale, self.scale);
    CGImageRef imageRef = CGImageCreateWithImageInRect(self.CGImage, 
            CGRectApplyAffineTransform(cropRect, rectTransform));
    UIImage cropped = [UIImage imageWithCGImage:imageRef scale:1. 
        orientation:self.imageOrientation];
    CGImageRelease(imageRef);
    return cropped;
}

После этого вырезается правильная часть:

середа, 1 квітня 2015 р.

UIView категория для скругления углов

Понадобилось мне для одного проекта под iOS реализовать вьюху, у которой углы должны быть скруглены только с одной стороны. Невозбранно стырив идею со Stack Overflow, сделал категорию для UIView и выложил файлики на GitHub.
Использование:

#import "UIView+Roundify.h

...

- (void) viewDidLayoutSubviews {
   [super viewDidLayoutSubviews];
   [self.someView addRoundedCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft)
                            withRadii:(CGSize){16.f, 16.f}];
 }
Пример работы:

Пользуйтесь.

вівторок, 24 лютого 2015 р.

Небольшой трюк при работе с git. Часть 2

В статье Небольшой трюк при работе с git я описал функцию g, которая немного упрощает работу с командой git. Однако, для этой функции не работает стандартное zsh-автодополнение. Помочь может команда compdef, которая позволяет связать существующие правила автодополнения с новой командой. После добавления в .zshrc строк:
# Actually set the compdef to git
compdef g=git
наша жизнь снова станет прекрасной и удивительной.

понеділок, 16 лютого 2015 р.

Небольшой трюк при работе с git

Добавив следующий фрагмент в .zshrc (или .bashrc):
function g {
  if [[ $# > 0 ]]; then
    git $@
  else
    git status
  fi
}
получим очень удобную функцию g: при вызове без параметров она вызывает git status, с параметрами - соответствующую команду git’а. Пример:

пʼятниця, 6 лютого 2015 р.

Сортировка import’ов в XCode

Озаботился сегодня красивым оформлением import’ов в программах на ObjC. XCode, конечно не Vim, но с помощью Automator’а можно создавать скрипты и для этой IDE. Например, в статье предлагается для сортировки import’ов использовать скрипт вида:
sort | uniq

Но я предпочитаю разбивать import’ы на группы:
  1. Стандартные
  2. Дополнительные библиотеки
  3. Локальные
Например:
@import AVFoundation;
@import GLKit;

#import <AssetsLibrary/AssetsLibrary.h>
#import <iCarousel.h>

#import "PreviewView.h"
#import "ViewController.h"
Поэтому сделал такой скрипт для сортировки:
#! /bin/sh
tempfoo=`basename $0`
ORIG_FN=`mktemp ${TMPDIR:-'/tmp/'}${tempfoo}.XXXXXX`

cat /dev/stdin > $ORIG_FN

grep '@import' $ORIG_FN | sort | uniq
echo
grep '#import *<' $ORIG_FN | sort | uniq
echo
grep '#import *"' $ORIG_FN | sort | uniq

rm $ORIG_FN
Единственный момент, на который следует обратить внимание: в Automator’е следует указать полный путь к этому скрипту.
Сам скрипт можно взять на GitHub’е.

пʼятниця, 30 січня 2015 р.

Использование меню в Vim для запоминания команд

Как известно, наши недостатки - это продолжение наших достоинств. Широкие возможности, гибкость, масса плагинов Vim‘а приводят к тому, что для его эффективного использования необходимо помнить множество команд и клавиатурных сокращений. Чтобы упростить себе процесс запоминания, я создал меню из часто используемых команд и указал соответствующие команды/сокращения. Например, фрагмент .gvimrc:
" Common commands
"
" Plugin 'fisadev/FixedTaskList.vim'
amenu User.TaskList\ (F2)    <F2>
" Plugin 'vim-scripts/YankRing.vim'
amenu User.YRShow\ (F3)     <F3>
" Vim common
amenu User.Clear\ search\ selection\ (<Leader>c)      <Leader>c

" Pad menu: Plugin 'fmoralesc/vim-pad'
amenu User.Pad.Pad\ list\ (:Pad\ ls)  <ESC>:Pad ls<CR>
amenu User.Pad.Pad\ new\ unnamed\ (:Pad\ new) <ESC>:Pad new<CR>

" vim:noexpandtab


В меню User я перечислил наиболее общие команды. Для файлов отдельных типов меню создаю в соответствующих файлах, например для blog, ~/.vim/bundle/vim-xblogger/ftplugin/blog.vim:
amenu Blog.Insert\ code\ (:Rc\ file_name) :Rc
amenu Blog.Post\ (<Leader>post)  <Leader>post
amenu Blog.TOC\ (<Leader>t)  <Leader>t
amenu Blog.Check\ links\ (:make)  :make<CR>

К сожалению, в MacVim не работает использование <Tab> для задания правой части текста пункта меню:
:amenu &File.&Open<Tab>:e  :browse e<CR>
Поэтому я использую ().
После подобных настроек Vim будет иметь вид:



P.S. Для ленивых есть плагин для автоматического построения меню. Но, как и любое универсальное решение, он не очень удобен.

вівторок, 13 січня 2015 р.

Проверка правописания в сообщениях к git-commit’ам

При выполнении коммитов в git-репозитарий было бы неплохо выполнять поиск ошибок в описании к комииту. Для этого необходимо:
  1. Установить vim в качестве редактора git’а (если это еще не сделано):
    git config --global core.editor vim
    
  2. Создать файл ~/.vim/ftplugin/gitcommit.vim:
    setlocal spell
    " Underline misspelled words
    hi clear SpellBad
    hi SpellBad cterm=underline
    
    Я также настраиваю подчёркивание ошибок
  3. Не стоит использовать при коммитах параметр -m message. В этом случае git будет вызывать указанный реактор для редактирования сообщения.
После этих настроек можно использовать средства vim’а для проверки правописания в комментариях к коммитам: