Arm1.ru

Категория CALayer+UIColor

Хорошую штуку нашёл на Stack Overflow. В Xcode в Interface Builder можно задать что-то для UI через User Defined Runtime Attributes. Мне понадобилось задать border. Так вот толщину границы layer.borderWidth задать можно и она подхватится, а вот цвет - нет. layer.borderColor хранит значение типа CGColorRef, а цвет, который ты можешь выбрать в Interface Builder - это UIColor. Простая категория позволяет использовать UIColor через свойство layer.borderUIColor.

CALayer+UIColor.h :

//
// CALayer+UIColor.h
//
// Created by Sergey Armodin on 29/05/15.
// Copyright (c) 2015 Sergey Armodin. All rights reserved.
//

#import <QuartzCore/QuartzCore.h>
#import <UIKit/UIKit.h>

@interface CALayer (UIColor)
/**
* CGColor to borderColor
*/
@property(nonatomic, assign) UIColor* borderUIColor;
@end

CALayer+UIColor.m :

//
// CALayer+UIColor.m
//
// Created by Sergey Armodin on 29/05/15.
// Copyright (c) 2015 Sergey Armodin. All rights reserved.
//

#import "CALayer+UIColor.h"

@implementation CALayer (UIColor)
/**
* Setter
*
* @param color UIColor
*/
- (void)setBorderUIColor:(UIColor *)color {
    self.borderColor = color.CGColor;
}

/**
* Getter
*
* @return UIColor
*/
- (UIColor *)borderUIColor {
    return [UIColor colorWithCGColor:self.borderColor];
}
@end

И вуаля:

Категория CALayer+UIColor

comment comments

CompareShots

CompareShots

Выпустил новое приложение - CompareShots.

В ходе работы возникла мысль, что неплохо бы иметь какой-то инструмент для сравнения макета и фактического результата. За вечер написал такую вот тулзу. Ещё за несколько вечеров сделал скриншоты. Да, на скриншоты ушло времени больше :)

Приложение позволяет выбрать 2 изображения из библиотеки устройства. Например, макет приложения или сайта от дизайнера, и скриншот того, что сделал разработчик, и проверить соответствие - действительно ли всё пиксель в пиксель свёрстано. Пока держишь палец на экране - показывается первая картинка. Убираешь - вторая. Есть слайдер прозрачности, можно наглядно увидеть, в каких местах несоответствие. Результат несоответствия в виде картинки можно расшарить или отправить по почте, или отправить в любой другое приложение, которое принимает картинки.

Приложения для iPhone и iPad.

Загрузить

comment comments

Потокобезопасное определение синглтона через GCD

Шпаргалка. Надоело каждый раз далеко бегать за ней.

+ (instancetype)sharedInstance {
    static MyClass *sharedInstance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        sharedInstance = [[self alloc] init];
    });
    return sharedInstance;
} 
comment comments

Получение номера дня недели на Objective-C

Шпаргалка по получению номера дня недели из NSDate:

/* берём Григорианский календарь*/
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
/* NSDateComponents позволяет вытащить из NSDate номер дня недели, день месяца и пр. */
NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]];
// получаем номер дня. Он будет от 1 до 7
NSInteger weekday = [comps weekday];

В iOS, в зависимости от того, какой выбран регион в настройках устройства,неделя начинается или с понедельника, как в России, илис воскресенья, как в США. Если нужно вывести лишь короткое название дня недели, например: пн, вт, ср, чт, то можно так:

NSDateFormatter *weekdayDateFormatter = [[NSDateFormatter alloc] init];
[weekdayDateFormatter setDateFormat: @"EE"];
NSLog(@"%@", [weekdayDateFormatter stringFromDate:dateFromString]);
comment comments

Симуляция плохого соединения с интернетом в OS X

Network Link Conditioner

Оставлю ещё одну шпаргалку в виде ссылки. Network Link Conditioner - тулза от Apple из набора Hardware IO Tools for Xcode. Позволяет лимитировать в макоси скорость соединения. Можно протестить, например, как приложение ведёт себя в условиях EDGE-соединений или хуже. То же самое есть в разделе Developer в настройках iOS, но то на девайсе, а тут в OS X.

Кстати, в том же наборе лежит симулятор для HomeKit.

comment comments

Автоувеличение номера билда в Xcode

Автоувеличение номера билда в Xcode

Ещё одна шпаргалка, чтобы потом быстро найти, в случае чего. В Xcode, как известно, можно при билде проекта запускать свои bash-скрипты.

Эти 2 строчки кода позволяют автоматически увеличивать номер билда в приложении:

buildNumber=$(git rev-list --all | wc -l)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "${PROJECT_DIR}/${INFOPLIST_FILE}"

Первая строка считает количество коммитов в git-репозитории. Вторая - пишет их количество в .plist-файл таргета как номер билда. Каждый новый коммит увеличивает номер билда на единицу. Это один из способов.

Пихать в Build Phases нужного таргета.

comment comments

Итог айПодписок

айПодписки

Итак, в феврале Яндекс всех пользователей Яндекс.Подписок насильно перетащил на сервис Яндекс.Новости. Без предупреждения и как-то по-свински всё это получилось. Веб-версия стала недоступна. Но API работало, про его судьбу яндексоиды лишь говорили, что оно будет работать. Но про сроки и планы молчали. Собственно, сначала перестали подсасываться новые RSS-записи и API давал доступ только к старым записям, а потом разослали всем письма, что 31 марта 2015 года API они тоже убьют. Что и произошло. Поэтому я убрал из App Store приложение айПодписки и хочу подвести какие-то итоги для себя и для истории.

Приложение я написал весной 2014 года примерно за неделю, кодя по вечерам. В App Store оно появилось 17 апреля 2014 года, о чём я радостно писал у себя и в посте на Хабре. Пост набрал рейтинг +15 и принёс какое-то количество скачиваний и запросов на фичи. Приложение не дотянуло 17 дней до своего первого дня рождения :)

За этот год было:

Итог айПодписок

1321 скачивание приложения и всего 496 обновлений, когда я выпускал новые версии. Негусто, но это и приложение не массовое. RSS вообще считается технологией для роботов и гиков. Абсолютное большинство пользователей из России. 2 и 3 место - США и Украина, там поровну. Рекорд: 77 установок за сутки.

Итог айПодписок

1431.42 р. дохода на внутренних покупках. Изначально приложение было бесплатным, но с рекламой и её платным отключением. Из моих 4 приложений в App Store, это худший результат. С другой стороны, получить какие-то деньги за то, что учишься, получаешь опыт и решаешь какую-то свою проблему - тоже неплохо :)

Итог айПодписок

Большую часть времени приложение находилось в Топ-200 в своей категории (Новости) в России. На скрине выше - самые высокие позиции, на которые оно заползало в топах.

Итог айПодписок

С оценками всё не очень. Я нигде не просил людей поставить оценку приложения, поэтому ставили её либо энтузиасты и друзья, либо недовольные. Я, к сожалению, пропустил глюк очень досадный. Когда приложение запускалось в портретном режиме - кнопка «Все подписки» просто не появлялась. В итоге пользователь видел только приветственный экран и кнопку «убрать рекламу» за деньги :) И грустно, и смешно. Сам я постоянно приложением пользовался в горизонтальном режиме и попросту эту проблему не замечал, зато получил отзывы типа «работает только реклама».

Большинство запрошенных фич я так и не смог реализовать по причине нехватки времени. Занимаясь веб-разработкой целыми днями, тяжело вечером переключаться на мобильную, да ещё и уставшим после работы.

В приложении показывается реклама из AdMob. За год было всего 71135 показов рекламы, которые принесли $23.87. То есть внутренняя покупка отключения рекламы принесла больше денег, чем сама реклама :)

Такие вот скромные, но итоги.

comment comments