Просто жж m4rr

ljmob.ru/read/user/m4rr

Скриншоты
loft
m4rr
15:21 26.09.2014
Скриншоты

Вот какие клевые выпадающие меню теперь — в айос-8 — получаются на айфоне в горизонтальном сайз-классе:


read source at It's time to legalize


Дополнение про Size Classes
loft
m4rr
16:38 23.09.2014
Дополнение про Size Classes

Сегодня появилась видеозапись моего доклада на августовской встрече разработчиков CocoaHeads Moscow. Ура!

Хочу еще немного добавить про особенности сайз-классов. В докладе я немного упомянул про специальные отступы от границ экрана. Это Leading Margin и Trailing Margin по бокам, и Top и Bottom Layout Guides сверху и снизу.

Leading Margin и Trailing Margin по бокам, и Top и Bottom Layout Guides сверху и снизу.

Например, вы проектируете единый интерфейс для айфона и айпада. И нужно сделать так, чтобы на разных дивайсах у кнопок, расставленных по бокам, были ожидаемые пользователем отступы. Для этого можно расставить кнопки именно относительно ведущего — слева — и замыкающего — справа — отступа. То есть, если нативный отступ слева на айфоне — это 8 пк, а на айпаде — 20 пк, то кнопки автоматически встанут как надо.

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

Кроме того, интересно, что Leading и Trailing Margin меняются местами, если на устройстве установлен какой-нибудь язык, который пишется справа налево (RTL). Для обычных LTR-языков они находятся слева и справа, соответственно.


read source at It's time to legalize


Скриншоты
loft
m4rr
11:57 22.09.2014
Скриншоты

Не очень люблю постить скриншоты куда-либо, но иногда попадается что-нибудь жутко интересное. Например, Эпл в своих приложениях стала использовать индикаторы загрузки (или даже HUD):

Или вот, например, с каким адом приходится сталкиваться всем дизайнерам клавиатур для Айос-8, чтобы объяснить пользователям, как же эту клавиатуру включить:

Или вот, например, официальное приложение Билайна заставляет клиентов вводить номер телефона, который и так известен этому приложению. И капчу:

Мир несовершенен, но мы знаем, как его улучшить, чо :)


read source at It's time to legalize


Size Classes
loft
m4rr
11:27 02.09.2014
Size Classes

В конце августа, на ежемесячной встрече разработчиков приложений для iOS и OS X CocoaHeads Moscow, я рассказывал про новую концепцию Size Classes, представленную Эплом на WWDC-2014. Это совершенно новый способ построения адаптивных интерфейсов для айос-дивайсов. Немного коснулся интересных тонкостей о том, как их использовать в приложениях на айос-8, и как их бекпортить на айос-6.

Встреча традиционно проходила в офисе Мейл-ру. Там точно была видеозапись и, кажется, даже трансляция. У меня пока этой записи нет, но вот слайды с презентации:

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

На этой встрече также докладывал Михаил Байнов про массивы и структуры ANSI C/C99, и Саша Зимин рассказывал материальный дизайн кнопок из нового Андроида-Л и показывал как это сделать на Свифте; с его презентации также доступны слайды.


read source at It's time to legalize


Как не показывать эмоджи в UILabel
loft
m4rr
13:30 25.08.2014
Как не показывать эмоджи в UILabel

Мы с другом сейчас работаем над одним очень интересным проектом, который выйдет осенью, вместе с Айос-8. И в этом проекте появилась задача: показать некоторые стандартные юникодные значки. Но, оказывается, если эти символы добавить в UILabel, то айось заменит их на картинки-эмоджи. Это, конечно, круто, но не то, что нам нужно.

Emoji UILabel

Я ничего не знал о том, как работают эмоджи, поэтому пришлось провести небольшой рисерч. Оказывается, в юникоде есть такая штука как variation selector. Он документирован в стандарте с 3.2.0, а сейчас уже — 6.0.

variation sequence, which always consists of a base character followed by the variation selector, may be specified as part of the Unicode Standard. That sequence is referred to as a variant of the base character. The variation selector affects only the appearance of the base character,* and only in the variation sequences defined in this Standard. The variation selector is not used as a general code extension mechanism.
Источники: раз, два.

Итак, variation sequence — последовательность, которая состоит из базисного символа и следующего за ним модификатора (variation selector). Такая последовательность ссылается на вариацию базисного символа. Модификатор влияет только на внешний вид символа.

Таким образом, юникодный символ, для которого существует эмоджи-картинка, мапится в эмоджи. Но существует такой модификатор U+fe0e, который, будучи добавленным к юникодному символу форсит выбор не-эмоджи варианта символа.

Короче, можем написать любой символ (U+2709 — для конверта), и к нему U+fe0e:

// Swift:
label.text = "Привет, посылаю тебе ✉︎\u{fe0e} не из этой страны"
// Objective-C:
label.text = @"Привет, посылаю тебе \U00002709\U0000FE0E не из этой страны";

И получить то, что нужно:

Non-emoji UILabel

(Кстати, есть еще кодировка эмотиконов Softbank, которая используется в смс. В опенсорсе на сайте Эпла есть таблица их мапинга в эмоджи и обратно: Any_SoftbankSMS.txt)


read source at It's time to legalize


Как поставить кнопки друг к другу
loft
m4rr
10:44 15.08.2014
Как поставить кнопки друг к другу

Иногда в интерфейсе айос-приложений нужно расставить кнопки друг к другу, чтобы ширина у всех автоматически стала одинаковой, как, например, в старом добром Тотал-командере:

Кнопки Тотал-коммандера

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

С появлением Size Classes в iOS 8, становится понятно, что любой другой способ получается слишком громоздким. Поэтому, задача расставления кнопок (UIButton или вообще любой UIView) сводится к правильной расстановке констрейнтов автолейаута.

Решение, вроде, простое на первый взгляд: нужно в Интерфейс-билдере сделать все кнопки одного размера, поставить их друг к другу, и привязать левую границу каждой кнопки к правой границе предыдущей кнопки. А левую и правую границы крайних — привязать к супервьюхе. И с первого подхода выходит вот такая фигня:

Damn auto layout!

Делаем второй подход, чтобы пофиксить это. Нужно задать всем вьюхам, что их ширины равны:

Good auto layout.

Ура!


read source at It's time to legalize


Как удалить все сабвьюхи
loft
m4rr
19:01 08.08.2014
Как удалить все сабвьюхи

Как известно, в Какао вьюхе нельзя послать сообщение для удаления всех сабвьюх. Я думаю, это потому, что так делать небезопасно. Но Обджектив-си настолько хорош, что сделать это можно достаточно просто, используя другие сообщения вьюхе. (Осознавая, чтó вы делаете.)

Например:

[self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

Метод `removeFromSuperview` — это обычный метод вьюхи, чтобы самовыпилиться. Метод `makeObjectsPerformSelector` — это метод вьюхи, чтобы выполнить селектор всем ее объектам.

А на Свифте, например, так:

self.view.subviews.map { $0.removeFromSuperview() }

Тут немного интереснее. Метод `map()` выполняется на всех объектах запускающего его обекта. Переменная `$0` — это первый передающийся в замыкание объект.

Вот так можно удалить все сабвьюхи.


read source at It's time to legalize


Что я узнал про Амстердам
loft
m4rr
17:33 08.08.2014
Что я узнал про Амстердам

Никогда раньше не был в Западной Европе на католическое рождество. Я подумал, что это должно быть интересно, и поехал на рождество в Нидерланды. Оказалось, что это самая атеистическая страна Европы.

В этой поездке была куча экспериментов:

  • Я впервые не бронировал гостиницу заранее, потому что интересно, как это.
  • Впервые не брал с собой наличные деньги.
  • Впервые отменил обратный билет и путешествовал по Европе не думая, когда полечу обратно.
  • Впервые решил пользоваться в поездке искючительно пластиковой картой, чтобы накопить миль в Рокетбанке :)

Первый кэш снял только в аэропорту, чтобы купить билет на поезд из Скипхола до центральной станции Амстердама. А оказалось, что билетный автомат в Схипхоле и сам принимает пластиковые карты!

В Амстердаме клево. Три дня из пяти погода была отличная. Остальные два дня шел дождь, но как-то он не мешал. Была отличная компания и хорошая одежда. (Нет плохой погоды — есть плохая одежда же.) В это время к нам в гости приехали ребята из Франции, привезли самогон из подвала дедушки одного из ребят, сидр и яблочный сок (тоже из подвала дедушки).

Обратите внимание на балаклаву!

Оказалось, что рождество в Голландии отмечается в узком семейном кругу, и на улицах ничего особенного не происходит. В Нидерландах два рождественских выходных: первые (eerste) и вторые (tweede) kerstdag. Девушки на Красных фонарях тоже, видимо, в семейном кругу: они не работают в эти дни.

По Амстердаму мы ездили только на великах. Это очень удобно. Велосипедисты имеют самый высокий приоритет на дорогах. Пешеходы и автомобилисты всегда уступают дорогу велосипедистам. (Это взрывает мозг велосипедистам из Москвы, конечно.)

Я был в Амстердаме 6 дней, и в конце декабря поехал в Берлин к ребятам в aic labs. Позже я снова вернулся в Амстердам на выходные в феврале. Скоро напишу.


read source at It's time to legalize


Свифт-хакатон от CocoaHeads Moscow
loft
m4rr
14:54 02.07.2014
Свифт-хакатон от CocoaHeads Moscow

На прошлых выходных ребята из CocoaHeads Moscow устраивали первый (в мире?) Свифт-хакатон. (Свифт — это новый язык Эпла для программирования под Айось и Макось.) Хакатон проходил в Москве, в офисе Мейл.ру два дня подряд.

Хакатон — это когда программисты собираются и без остановок программируют. Два дня и всю ночь около 50 человек, — айос-разработчиков, — которые придумали себе достаточно сложные задачи, решали их, чтобы предложить миру эти решения.

В офисе Мейл-ру очень хорошо и уютно. Свежие соки, кофе, чай, кола, печеньки, массажные кресла и переговорки — все, что угодно было для нас бесплатно в эти выходные. И еда! Повара на кухне кормили нас три раза в день, огромное спасибо им за это. И это для того, чтобы мы хорошо работали и не скучали :) И мы работали!

Мы с ребятами собрались в команду, чтобы решить задачу вычленения основного текста из контента веб-страниц. Поделились на две группы: первая делает пользовательский интерфейс приложения, вторая — парсер и распознавалку ссылок и текста страниц.

Стоит отметить, что, конечно же, есть гемы и другие серверные решения для этой задачи. А в нашем случае парсинг происходит непосредственно на айос-устройстве. Потому что это Свифт-хакатон!

Мы стали экспериментировать с подходами к разработке. Создали два таргета в Икскод-проекте, две ветки в Гите (и потом задолбались их мерджить, но зато комильфо!) А также проектирование, прототипирование, какао-поды и т. д.

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

  • вытащить текстовые хтмл-теги (article, h1...6, p и т. д.), но это не везде хорошо работает
  • поискать самый длинный контент в тегах, но это не гарантирует основной текст
  • посчитать количество точек в каждом теге и, где больше, — там основной текст, но это жесть
  • предложить юзеру указать на основной текст, лол

Мы решили комбинировать несколько разных методов, и, рекурсивно пройдя по дереву элементов, нашли текстовые теги, нашли их родительский элемент, нашли похожие цсс-классы среди них. Подсчитали цену (удельный вес) атрибутов каждого элемента, вытащили это из остального контента и собрали итоговый текст. А главное, что сначала наше приложение парсит первую страницу почти любого указанного сайта, и вытаскивает ссылки на внутренние страницы.

За рамками отведенного на хакатон времени еще осталась куча придуманных фич. Но в результате получилось 139 коммитов, и отличная база для дальнейшей работы.

Все проекты лежат на гитхабе CocoaHeads Moscow:

Спасибо CocoaHeads Moscow и огромное спасибо компании Мейл-ру. Было здорово!

Здание Мейл-ру и вид из офиса во время рассвета:


read source at It's time to legalize


 Яндекс.Карты
loft
m4rr
16:00 20.06.2014
 Яндекс.Карты

Яндекс теперь показывает подписи к объектам на своих картах. Очень интересно и клево. Сейчас бывают ошибки в подписях, например, Академию ФСБ на Юго-западе подписали как какую-то церковь. Но для таких случаев, прямо на карте можно сообщить об ошибке (что я и сделал :-)

Но еще очень интересен формат подписей. Или даже дизайн:

Яндекс-карты

Если присмотреться, то можно заметить, что эти подписи совсем не похожи на гугловские. У Гугла там вообще мрак:

Гуглокарты

А если присмотреться еще внимательнее, то можно подумать, что Яндекс выбрал Apple way:

Эпл-карты

Круглая иконочка, цветовое кодирование, короткий текст, подпись снизу.

Выглядит, как-будто Яндекс подготавливает выдачу в стиле Эпла (хотя, на самом деле — близкую к здравому смыслу). Если Эплу вдруг понадобятся более правдоподобные данные для России, то у Яндекса, например, все уже будет готово.

Яндекс и сейчас предоставляет Эплу метаданные, например, о времени работы организаций. Может, Яндекс хочет стать не просто провайдером метаданных, но и провайдером вообще всех данных на картах Эпла? Круто, если так!


read source at It's time to legalize


?

Log in