вівторок, 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’а для проверки правописания в комментариях к коммитам: