Arm1.ru

Tag: «полезное»

Анимация касания индикатора в UISlider

Анимация касания индикатора в UISlider

Стояла задача - при касании слайдера анимировать в приложении сделать анимированное увеличение ползунка. Так же, как это сделано у Apple в приложениях Apple Music и Podcasts в плеере, когда начинаешь перематывать позицию воспроизведения. Пока искал способ стандартными средствами, убил немало времени. Очень не хотелось писать прям свой кастомный слайдер, хотелось использовать системный UISlider, что мне, в итоге, и удалось.

Читать далее...

comment comments

Лог-функция для Swift с выводом файла, метода и строки

Функция-шпаргалка для логирования в Swift:

import Foundation

/**
 Лог-функция с выводом файла, метода и строки, откуда вызывается. 
 Пример использования: DLog("привет")

 - parameter messages: тексты/объекты, которые надо вывести
 - parameter fullPath: путь до файла, который вызывается
 - parameter line: номер строки в файле
 - parameter functionName: название метода/функции вызова
*/
func DLog(messages: Any..., fullPath: String = #file, line: Int = #line, functionName: String = #function) {
     let file = NSURL.fileURLWithPath(fullPath)
     for message in messages {
          print("\(file.pathComponents!.last!):\(line) -> \(functionName) \(message)")
     }
}

// Пример:
DLog("message 1", "message 2")
// YourClass.swift:42 -> someMethod() message 1
// YourClass.swift:42 -> someMethod() message 2
comment comments

Простой console.log с выводом файла и номера строки в Node.js

Пока кодю на Node.js нужно постоянно что-то выводить в консоль. Например, ошибки. Но для большей информативности удобнее знать, где именно ошибка выводится. Тем более, что пока кодил под iOS такой удобный макрос всегда был под рукой, а с Node.js пришлось погуглить и поковыряться, т.к. многие примеры со Stack Overflow просто падали на последней версии Node.js 5.10.0. Падали из-за использования в них Error.captureStackTrace(err, arguments.callee), а сейчас уже нужно использовать NFE.

В итоге сделал то, что хотел. Оставлю тут как шпаргалку.

npm install colors --save

Файл logger.js:

'use strict';

let colors = require('colors');
colors.enabled = true;

exports.p = function logger(somethingForPrint) {
    somethingForPrint = somethingForPrint || '';
    const originalPrepareStackTrace = Error.prepareStackTrace;

    Error.prepareStackTrace = (error, stack) => { return stack; };

    let e = new Error;
    Error.captureStackTrace(e, logger);

    const stack = e.stack;
    const filename = stack[0].getFileName().split('/').reverse()[0];
    const trace = filename + ':' + stack[0].getLineNumber() + " " + colors.bold.black('%s') + "\n";

    Error.prepareStackTrace = originalPrepareStackTrace;

    console.log(trace, somethingForPrint);
}; 

Использовать:

const logger = require('../utils/logger');
logger.p('something happened');
// file.js:401 something happened 
comment comments

Transparent Image Viewer для OS X

Transparent Image Viewer для OS X

Я всё пытаюсь что-нибудь придумать, чтобы можно было удобно делать pixel perfect вёрстку экранов при разработке iOS-приложений. Чтобы можно было удобно и наглядно сравнивать макет и результат. Запилил сегодня вот такую тулзу для OS X - почти прозрачное окно, в котором можно открыть макет, наложить на Xcode или на симулятор и смотреть, что получилось. Ползунком можно менять прозрачность, чтобы проверять соответствие.

Может кому пригодится. А может кто-то тоже чувствует боль и поучаствует в разработке.

Исходники лежат на github.

Скачать бинарник.

P.S. моё первое приложение для OS X.

comment comments

Категория 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 
#import 

@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

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

Network Link Conditioner

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

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

comment comments

node-couchdb-mover

node-couchdb-mover

На днях написал свою первую тулзу Node.Js. Писал лишь отчасти для себя, т.к. для меня она пока не очень актуальна, а вот кое для кого даже очень.

Тулза для CouchDB. Т.к. CouchDB хранит после изменений/удалений документов ревизии и не всегда их очищает, бывает, что база адски растёт в размере. Например, у ребят, для которых эта тулза актуальна сейчас, то, что должно весить 6 гигов, весит 50-60. Может быть они где-то запустили что-то или накосячили, понаменяв и понаписав кучу всего в базу, чем люто увеличили её размер. В общем, проще просто создать новую чистую базу и перенести туда все живые документы.

Тулза просто берёт все документы из 1 базы в CouchDB, и кладёт их в другую. Работает пока довольно топорно, берёт все документы скопом и потом по 1 кладёт в базу. Для баз с относительно небольшим количеством документов работает нормально, а вот если их там тысяч этак 80, то у меня на компе получение документов длилось около 4-5 минут. Поэтому переделаю её вскоре, чтобы брала документы пачками и фигачила внесение в базу не асинхронно, а по очереди.

Но пока пользоваться можно. Тулзу можно встроить, например, в свой Node.Js проект.

В консоли:

npm install node-couchdb-mover

В коде:

var mover = require('node-couchdb-mover');
mover.moveDocuments('dbName1', 'dbName2');

Кроме того, её можно использовать прямо из консоли:

npm install -g node-couchdb-mover
couchdb-mover --from=dbName1 --to=dbName2

Ну, и как это положено, исходники на гитхабе | пакет на npmjs.org.

comment comments

Как узнать ретина дисплей или нет?

Как узнать ретина дисплей или нет?

Ко мне в блог много заходов из поисковиков по запросам вроде «Как определить дисплей retina». Попадают они ко мне на статью про Objective-C, но ищут они явно не код :) Запилил в итоге такую вот страничку, на которую надо просто зайти через браузер с вашего устройства. Если ретина - результат будет зелёным, как на скрине выше. Если не ретина - то красный, как на скрине ниже.

Как узнать ретина дисплей или нет?

Работает для iOS-устройств (iPhone, iPad, iPod) и Mac с экраном Retina. На экранах с высокой плотностью пикселей на дюйм тоже пишет, что retina :)

Адрес страницы: https://arm1.ru/retina/

comment comments

Скрипт для фиксирования блока при скролле

Давно хотел такую штуку сделать, чтобы при скролле страницы какой-то блок скроллился вместе со страницей до определённого момента, а потом прилипал. Сегодня нашёл такой плагин под названием jQuery Sticky Scroller

Скачать его можно тут.

Подключается он довольно просто:

var scroller = new StickyScroller("#menu",
{
start: 270,
end: 50800,
interval: 200,
range: 100,
margin: 0
});

Собственно, по названию параметро понятно, что когда скролл уходит за 270 пикселей от верхней границы страницы - элемент #menu фиксируется на странице, то есть получает свойство CSS "position: fixed;". Параметр end отвечает за нижнюю границу отслеживания скролла, на случай, если фиксированным эллемент должен быть не всегда. Параметр margin задаёт то - с каким отступом от верхней границы окна браузера будет находиться элемент. 

У плагина есть также несколько публичных методов, описывать их смысла не вижу, описание есть на странице плагина.

Примеры поведения такого блока: Яндекс.Музыка. Конкретно это плагин я применил на avrora-zal.ru, ну и пример с более сложным его использованием на сайте автора.

comment comments

Увеличение громкости iPhone 4

Увеличение громкости iPhone 4

 

У меня iPhone  4 из Франции. В телефонах для продажи во Франции Apple обязали ограничить громкость звука в наушниках, мол, заботятся о своих гражданах и не хотят, чтобы они глохли. Мне, в условиях метро, громкости в итоге не хватает, к тому же наушники бывают разные, какие-то играют громче, у каких-то сопротивление другое и они играют тише. 

В общем это ограничение можно обойти. Для этого нужно сделать Jailbreak, после чего получить доступ к файловой системе и изменить пару plist-файлов. Вариантов много - от установки какого-нибудь Терминала через Cydia, до монтирования телефона как раздела на компе. Мне больше нравится второй вариант - поставил Phone Disk - он подклчил мой телефон как раздел, а дальше надо пошариться по файловой системе.

Читать далее...

comment comments

Встраивание Facebook sdk в ios-приложение

Шпаргалка. Инструкция по тому, где скачать и как встроить - в документации Facebook. Несмотря на то, что обновляли они проект на Github недавно (23 ноября на данный момент), в нагрузку идёт у них старая версия фреймворка для работы с JSON. А, т.к. в мой проект уже встроена более новая версия фреймворка приложение не компилилось.

Решение:

  1. после добавления SDK в проект удалить папку JSON из SDK Facebook;
  2. в файле FBRequest.m заменить строку #import "JSON.h" на #import "SBJson.h";
  3. в том же файле строку SBJSON *jsonParser = [[SBJSON new] autorelease] заменить на SBJsonParser *jsonParser = [[SBJsonParser new] autorelease].

Должно работать. 

comment comments

Обрезание слэша в url с 301 редиректом

А собственно почему бы и не повесить этот тут, потом будет легко найти, когда опять понадобится. Зачастую поисковики воспринимают страницы вида:
//arm1.ru/blog/yandex-upal-panika-v-twitter
//arm1.ru/blog/yandex-upal-panika-v-twitter/
  как разные страницы. Получается, что один и тот же контент технически по двум разным страницам, что не есть хорошо. Под катом код для автоматического отрезания символа / в конце с 301 редиректом, чтобы поисковики не дублировали страницы при индексировании.

# убираем QUERY_STRING строку из REQUEST_URI
$uri = $_SERVER['REQUEST_URI'];
if ( false === empty( $_SERVER['QUERY_STRING'] ) )
	$uri = str_replace( '?' . $_SERVER['QUERY_STRING'], '', $uri );
			
# переадресация через 301 редирект при присутствии слэша в конце $uri
if ( substr( $uri, -1 ) == '/' && strlen( $uri ) > 1 ) {
	$queryString = '';
	if ( false === empty( $_SERVER['QUERY_STRING'] ) )
		$queryString = '?' . $_SERVER['QUERY_STRING'];
 
	header( 'Location: ' . substr( $uri, 0, -1 ) . $queryString, true, 301 );
	exit;
}

 

comment comments

Пара настроек FCKEditor

В качестве шпаргалки - чтобы быстро настроить FCKeditor. Хоть он уже и устарел и разработчики делают CKEditor - но в нём нет бесплатного файлового менеджера, а в CKEditor - есть.

Это что-то вроде шпаргалки для быстрого подключения FCKEditor.

Читать далее...

comment comments

Ресайз анимированных gif-изображений с помощью Imagick

 По работе столкнулся с необходимостью обработки анимированных gif-аватарок. Исходные картинки могут быть любого размера, и их нужно уменьшить до нужного размера с кадрированием до квадрата. Под катом - как мы это решали.

Читать далее...

comment comments

Простой онлайн TimeStamp конвертер

По работе периодически приходится смотреть какие-то данные из базы. Время мы в основном храним в TimeStamp (количество секунд, прошедших с сотворения мира Unix, то есть 1 января 1970 года).

По цифре вроде 1305233826 хрен поймёшь, что это за дата. Каждый раз писать в каком-нибудь скрипте конвертирование неудобно, поэтому сделал онлайн-конвертер. Показывает время в удобочитаемом виде.

Enjoy. Online TimeStamp Converter

comment comments