iOS Makes Me Hate
3.94K subscribers
1.17K photos
167 videos
15 files
1.34K links
Авторский канал про iOS разработку. Путь продуктовых самураев в MAANG.

Самое больше iOS сообщество практиков: https://boosty.to/lionbond/

Автор: @lvbond Senior iOS Yandex, ex-Avito, VK
Download Telegram
UIView vs CALayer

🟢 lvl: jun

🟣 У каждого view есть свой layer. Каждый лейер нужен для отрисовки внутри вью. Вью — это делегат слоя.

🟣 Когда мы устанавливаем backgroundColor вьюхи, то по сути мы устанавливаем backgroundColor для слоя. Или если мы устанавливаем backgroundColor для слоя напрямую, то backgroundColor для вью устанавливается аналогично

🟪 У слоев есть подслои. Или же дерево слоев аналогично с деревом вьюх

#lvl_jun
👍18
Figma Export

Еще одна полезная тулза для автоматизации рутиных обновлений.

Полезно, когда ходите всегда держать актуальные цвета, фонты и иконки, если ваши дизайнеры любят менять фигму и не уведомлять об изменениях

Все генерится прям в код. Ну и при желании можно конечно подредачить

Единственное условие — нужна платная подписка на фигму

Подробнее в этой статье
👍8❤‍🔥3🔥2
Frame vs Bounds: Как работает UIScrollView?

🟢 lvl: jun

Что будет с сабвьюхами, если мы изменим frame или bounds у их супервью?

1. Изменяя frame также меняются его сабвьюхи.

2. Изменяя bounds у супервью наша позиция остается неизменной, но сабвьюхи внутри будто смещаются.

Это происходит потому, что супервью имеет свой фрейм относительно своего супервью. И фактически меняя bounds мы меняем начало координат по отношению к его собственным.

Этот эффект похож на эффект пленки и фиксированной камеры.
📸 Камера — это вью. Она неподвижна и стоит на месте.
🎞 Пленка — это контент внутри, который позиционируется относительно системы координат.

подробнее в этой статье:
https://oleb.net/blog/2014/04/understanding-uiscrollview/
❤‍🔥131
Отойдем немного от программирования и погрузимся немного в аджайл и скрам

Кто меня хорошо знает, тот наверное слышал, как я люблю заливать про гибкие методики разработки. И может через лет 10 я уйду из разработки и стану аджайл-коучем и скрам мастером 🤡

Но а если серьезно, то тема планирования одна из сложнейших. Часто какие-то инфоцыгани зальют о том, что главное это помодоро, джедайские техники и какой-то приоритезатор задач SMART

Я глубо с этим не согласен. Это хорошо работает как пилюля против прокрастинации. Но мы с вами разрабы. Где помимо своей вовлеченности и нефокусировки есть хаос.

Хаос — это враг. Мы с ним деремся в коде. Мы с ним сражаемся в джире. Мы ноем о нем на ретро и дейли.

Чужое легаси. Непонятное тз. Вагон зависимостей. Телега факторов, которые страшнее твоей мотивации.

В этой статье есть крутые вводные и инструменты. На мой взгляд борьба с неопределенностью это не геройство и не дисциплина. Это целая наука и искусство

https://habr.com/ru/post/536570/
👍9🔥2👎1
Высокий перфоманс для UI

🟡 lvl: mid

Отличный цикл статей от разработчика игр на iOS.
В них легко можно изучить основы оптимизаций и прокачать свой скил GPU инженера на космический уровень.

Также советую познакомиться с другими статьями автора

1 часть
2 часть
❤‍🔥5🐳3💯2👍1
"Дизайн-мышление в бизнесе" Тим Браун

Вода: 30%
Полезность: 8 из 10

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

Все начинается с эмпатии и аналитики. Проектная и аутсорс разработка когда-то сильно меня зафреймила и дала глупую установку, что заказчик всегда прав. "Кто платит тот и девушку танцует".

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

Дизайн мышление — это один из инструментов клиентоцентричности. Им пропитан весь менеджмент сбера. В книге есть множество советов и философий

Однозначно топ.

#book
👍6🔥2
Обновление лайаута: SetNeedLayout vs LayoutIfNeeded

🟢 lvl: jun

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

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

НО НИКОГДА НЕ ДЕЛАТЬ ЭТО НАПРЯМУЮ

Вместо прямого вызова у нас есть 2 метода.

1️⃣ setNeedsLayout — сообщаем нашей системе перерисовать вью ассинхронно в следующем цикле отрисовки.

2️⃣ layoutIfNeeded — напротив же сообщает системе, что нужно отрисовать вью и его сабвьюх немедленно, не дожидаясь следующего цикла отрисовки.
🔥13🐳4
Как ViewController'ы загружают свои View

🟡 lvl: mid-

ℹ️ Вьюконтроллер хранит свою вью как проперти. Только созданный VC не будет загружать вью по-умолчанию.

Если мы обращаемся к view, когда оно равно nil, то viewcontroller вызывает метод loadView(). Ленивая загрузка помогает создать вью только тогда, когда она необходима.

⚠️ Не стоит вызывать loadView самостоятельно, Если мы хотим принудительно загрузить нашу вьюху, то стоит вызвать loadViewIfNeeded().

Если же хотим проверить загрузил ли контроллер вьюху, не вызывая loadView для загрузки, то можно использовать isViewLoaded.

мы также можем обратиться к вью контролера через viewIfLoaded, или получим nil, если оно не загруженно

#lvl_mid
🔥141
блэт ватермарку пришлось ставить, потому что мой труд в фигме нагло крадется в ваши гиты, каналы и тп 🤡. А в наш культ нужны еще последователи. Если вы себе берете, то хотяб отмечайте

я че зря кнопки крашу в фигме что ли. Художника может любой обидеть
👍36❤‍🔥21
Proxyman

короче, вы наверное уже знаете об этом замечательном сниффере, но я только пощупал его. До этого юзал Charles. Купил честным трудом лицензию 2 года назад. Не хотел уходить и предвзято смотрел на proxyman. Ведь за что я 7к руб отдавал? Чтоб сразу уходить с нее?

И пару дней назад, из-за долгих и лагующих моментов я все же установил proxyman. В разы удобнее. Быстрее. Лучше. Стильней.

Прощай, старушка Charles. Ты была дорога во всех смыслах
👍12😢5🤔3🔥1💩1
The iOS Interview Guide

Полезность: 4,5 из 5

Думаю, лучше этой книги вы не найдете ни одну статью. Здесь множество различных вопросов, которые с 99% встретятся вам на практике

Не знаю, почему ее раньше игнорил, ведь каждое 2 из 3 интервью имеет формат этой книги.

Закрываем интернет. Лучше уже не будет

#books
🔥21👍1
Кажется, правильные установки и контексты, гораздо важнее технических знаний.

Знания и инструменты без контекста бесполезны. Часто вы проходите курс, в котором были только технические штуки, и после он кажется бесполезным. Ведь вас не погрузили в контекст проблем.

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

Будь это жизнь. Или работа

https://youtu.be/1Ji_n0w67kI
👍7❤‍🔥4
UIKit: setNeedsDisplay, layoutSubviews

🟢 lvl: jun

ℹ️ Выше мы познакомились с тринерами обновления layoutSubviews. Но что делать, если мы хотим перерисовать графику, которая не затрагивает размеры? Например перерисовать нашу вьюху в круг, изменить изображения и поменять

Метод setNeedsDisplay очень похож на setNeedsLayout. Он также выполняется ассинхронно и автоматически вызовет drawRect

💁 Также про layoutSubviews дополню. Он может вызваться по ситуациям:
- вызов addSubview
- Установка frame для вьюхи
- Прокрутка UIScrollView
- Поворот экрана

#lvl_jun
👍8🐳1
UIKit: updateConstraints

🟡 lvl: mid-

Как мы уже выяснили существует три этапа расчета и перерисовки вьюх в Auto Layout:
1️⃣ обновление констрейнт, когда система вычисляет и устанавливает их для вьюх.
2️⃣ Затем идет этап прохода лайатуа (layout pass), где механизм лайаута (layout engine) вычисляет фреймы вьюх и сабвьюх, размещая их.
3️⃣ Проход display завершает цикл и при необходимости перерисовывает содержимое вьюх, вызывая их draw методы, если они реализованы.

Подобно методу layoutSubviews и draw метод updateConstraints следует только раз переопределить и никогда больше не вызывать напрямую.

Внутри переопределенного метода следует разместить констрейнты, которые могут измениться. Статичные можно оставить в конструкторе или viewDidLoad.

Обычно updateConstraints() тригерит внутренний флаг, который обновляет констрейнты в следующем цикле обновления если:
- активировали/деактивировали констрейнты
- поменяли приоритет констрейнт или константное значение
- удалили вью из иерархии

Однако мы можем стригерить обновление констрейнт вручную:

🟣 setNeedsUpdateConstraints() — гарантирует обновление констрейнтов в следующем цикле обновления. Он запускает updateConstraints(), отмечая, что один из констрейтов вьюхи был обновлен. Этот метод работает аналогично setNeedsDisplay() и setNeedsLayout().

🟢 updateConstraintsIfNeeded() — Этот метод аналогичен layoutIfNeeded, но для вьюх использующих Auto Layout. Он проверит флаг «constraint update» (который может быть установлен автоматически, с помощью setNeedsUpdateConstraints или с помощью invalidateInstrinsicContentSize). Если он определит, что констрейнтам нужно обновление, он немедленно вызовет updateConstraints() и не будет ждать окончания ран лупа.

#lvl_mid
❤‍🔥9🐳2👍1
Stack vs Heap

Этот вопрос заставляет потеть двух из трех разрабов. А все потому, что это основные различия между value/ref семантикой.

В этой статье легким языком объясняется что, зачем, куда и почему стэк быстрее кучи

https://otus.ru/nest/post/605/
👍13
☢️ Так.

Первое правило клуба - никому не говорим о клубе.

Хочу в начале сентября сделать первые микро-интенсивы.

ℹ️ Формат такой. Мы за неделю собираемся в группу, создаём закрытый чат и общаемся там.

Каждый день мы разбираем задачу одного из пяти блоков: управление памятью, swift, UIKit, многопоточка и архитектура.

Утром падает задача всем. Каждый решает сам максимально нестандартно без копипасты с интернета. Вечером мы быстро собираемся и защищаем свою работу публично. Это не будет порицанием, а скорее коллективное программирование и кодревью.

⛔️Группу уже буду собирать. опыт от полу года в иос. Нужно знать базу хотяб что такое массивы, словари и сеты. Взнос 1500 руб.

Пишите в лс @lvbond
🔥15❤‍🔥2👎1😁1😢1
🚨И главное!!!

Хочется сделать это максимально полезно для всех. Независимо от того, джун ли ты или сеньор, персонаж из манги.

Чем разнообразней опыт и подходы, тем лучше
Про собесы

Проходить собесы надо — даже если вы не собираетесь менять работу. Рынок может меняться. Вы можете меняться. Спрос может меняться, а наша зп и ее индексация нет.

Обратная связь с реальной жизнью очень важна.

Это может работать в 2 стороны:
- у вас высокая зп на текущей уже второй год. Вы захотели сменить работу по разным причинам и поняли, что вам переплачивают на текущей. А уйти сильно хочется не по финансовым причинам
- я просидел несколько лет на одной работе и вдруг оказалось, что на рынке я стою х2. Как бы вы не хотели считать, что деньги не главное, но х2 есть х2 и ваши дети, жена и семья могут посчитать эгоизмом и слабостью отказывать от дохода, который улучшит жизнь всех

Собесы также могут подсветить вещи, которые стоит подкачать. Но чаще это формат тестирования или экзамен по сдаче прав. Стоит помнить, если вы зубрите только тесты и любите кататься с душными типами на экзаменах, то это вас не особо спасет в реальной практики и не убережет от дтп.
🐳7🔥52👍2
Escaping closure

🟢lvl: jun


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

Чтобы наш клоужер мог "убежать" мы можем:
1️⃣ Отправить выполняться клоужер в другой очереди в многопоточности. Ну, или в той же, но ассинхронно
2️⃣ Хранение замыкания за пределами функции.

🅰️ Почему важно знать, что такое убегающее замыкание?

Еscaping closure может привести к reference cycle, если мы не используем weak, unowned ссылки для захвата сильных ссылок.

#lvl_jun
👍9🔥31