EasySwift iOS🍏
3.02K subscribers
268 photos
8 videos
393 links
Все самое интересное в мире iOS разработки 🧑🏻‍💻

Предложить статью или новость: @EasySwiftBot

По всем вопросам обращаться к @itereznikov
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Анимированный TabBar

В данной статье автор разбирает, как сделать кастомный, аниммированный TabBarController. Много практики, полезного кода, а самое главное что свой материал он группирует на следующие группы:

Классы и модели
Свойства BubbleTabBar
Инициализация и первая прорисовка
Общедоступные методы
Анимация
8👍2🔥2
RxSwift и реактивное программирование

RxSwift решает проблемы изменяемого состояния, позволяет составлять последовательности событий и улучшает архитектурные концепции, такие как изоляция кода, возможность повторного использования и развязка. Основными строительными блоками кода Rx являются наблюдаемые операторы и планировщики.

Наблюдаемый

Rx - это общая абстракция вычислений, выраженная через интерфейс Observable<Element>, который транслирует и подписывается на значения и другие события из наблюдаемого потока. ObservableTypeПротокол (которому Observableсоответствует) чрезвычайно прост. An Observableможет излучать (а наблюдатели могут получать) только три типа событий:

Планировщики

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

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

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

Статья
8👍4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Как временно закрыть весь экран вашего приложения

В этом коротком руководстве мы рассмотрим, как временно покрыть весь экран вашего приложения пользовательскими файлами UIView. В целом это имеет два основных варианта использования:

1️⃣ Затемнение фона для отображения всплывающего содержимого

2️⃣ Скрытие содержимого в переключателе приложений, чтобы скрыть потенциально конфиденциальную информацию или просто показать пользователю что-то веселое.

Оба работают одинаково, но код для отображения и скрытия этих представлений отличается.

Подробнее прочитать в данной статье
🔥54👍2
Многопоточность Swift

Что такое процесс? Процесс - это программа, запущенная на вашем компьютере.

Что такое поток? Поток - это последовательность инструкций, которые могут выполняться средой выполнения.

Что такое основной поток? Каждый процесс имеет по крайней мере один поток. В iOS основной поток, в котором запускается процесс, обычно называется основным потоком

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

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

Как мы можем добиться многопоточности?

Ваше устройство имеет несколько ядер процессора. Чтобы использовать эти ядра, вам нужно будет использовать несколько потоков. Параллельное выполнение работы также известно как параллелизм.

Подробно можно прочитать в данной статье
9👍7
MVVM + POP для работы со сложным пользовательским интерфейсом

Компонент View (Примечание: UIViewController — это View) может иметь внутри ViewModel и полагаться только на него.

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

Модель:  модель данных или тип значения

Интерфейс/Протоколы/Абстракция — все это относится к одной и той же идее решения многих задач.

Протоколы в Swift на самом деле дают больше возможностей, например,

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

Protocols позволяет писать расширяемый код. Например. У вас может быть расширение для существующих классов, перечислений и т. д. и добавление к нему дополнительных функций без создания подкласса.

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

Пример реализации МВВМ и ПОП можно посмотреть в данной статье
6👍2🔥1
Как создать собственный верхний и нижний колонтитулы с помощью UIHostingConfiguration

Когда Apple представляет UIHostingConfigurationна WWDC, они в основном фокусируются на демонстрации того, как мы можем использовать его для создания пользовательских ячеек для представления таблицы и коллекции. Это заставляет меня задаться вопросом, можно ли создать собственный верхний и нижний колонтитулы, используя файлы UIHostingConfiguration.

В данной статье вы можете посмотреть, как можно это реализовать. Практически, полезная штука, которая может применяться во многих кейсах.
4
iOS swift — setNeedsLayout против layoutIfNeeded против layoutSubviews()

Когда запускается приложение iOS, UIApplication в iOS запускает основной цикл выполнения приложения, который выполняется в основном потоке. Основной цикл выполнения обрабатывает события (например, касания пользователя) и обрабатывает обновления интерфейсов на основе представлений. По мере возникновения событий, таких как касание, обновления местоположения, управление движением и мультимедиа, цикл выполнения находит соответствующий обработчик для событий, вызывая соответствующие методы, которые вызывают другие методы и так далее.

— setNeedsLayout()
Метод setNeedsLayout для UIView сообщает системе, что вы хотите, чтобы она разметила и перерисовала это представление и все его подвиды, когда пришло время для цикла обновления. Это асинхронное действие, потому что метод завершается и возвращается немедленно, но только через некоторое время макет и перерисовка действительно происходят, и вы не знаете, когда будет этот цикл обновления.

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

— layoutSubviews()
Реализация по умолчанию использует все ограничения, которые вы установили для определения размера и положения любых вложенных представлений.
13👍5
Продвинутый дебаг в Xcode: средства отладки, про которые часто забывают

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

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

Всем удачного дебагинга!
👍63
Управление памятью в Swift

Помимо места, используемого для загрузки своего собственного байт-кода, программа использует при работе две области в оперативной памяти — стек (stack) и кучу (heap).

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

Куча
Куча используется для динамического выделения памяти, однако, в отличие от стека, данные в куче первым делом требуется найти с помощью «оглавления». Можно представить, что куча это такая большая многоуровневая библиотека, в которой, следуя определённым инструкциям, можно найти необходимую книгу.

Подробное описание про память, советую прочитать данную статью
12👍3
Как упростить вёрстку интерфейса при помощи UIStackView

UIStackView - автоматический, скомпонованный объект, из него легко сделать адаптивный дизайн.

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

Разобрать UIStackView с примерами - можно в этой статье.
👍7🔥31👏1
Структуры против Классов

1. В массив лучше всего класть структуры.

2 .Если хочется создать массив из классов, то лучше выбрать обычный Array, так как ContiguousArray предоставляет преимущества редко, и они не сильно высоки.

3. Inline оптимизация ускоряет работу, не отключайте её.

4. Доступ к элементам Array всегда быстрее, чем доступ к элементам ContiguousArray.

5. Структуры всегда быстрее классов (если конечно включить Whole module optimization или подобную оптимизацию).

6. При передаче объекта в функцию и вызове его свойства, начиная с третьего, структуры быстрее классов.

7. При передаче значения в функцию, написаную для Generic и Protocol, Generic будет быстрее.

8. При наследовании классов
скорость вызова функции деградирует.

9. Переменные с пометкой final работают медленнее обычных перечных.

10. Если функция принимает объект, объединяющий протоколом несколько объектов, то он будет быстро работать, если в нём хранится всего одно свойство, и сильно деградировать при добавлении большего количества свойств.

Статья:
12👍5
Как персонализировать и использовать UISlider в Swift

Данная статья разделена на две части: первая о том, как сделать ваш слайдер немного отличающимся от дефолтного слайдера, костамизировать его. Вторая часть, как получить доступ и использовать его значения.

Cтатья про кастомный UISlider
🔥5👍21
Что почитать начинающему iOS разработчику?

Язык Swift прост, понятен и отлично подойдет как новичкам, так и опытным программистам. Чтобы начать писать код, вам потребуются только эта книга, компьютер и желание учиться. Все базовые концепции программирования и основы синтаксиса объясняются доступным языком, поэтому если вы никогда раньше не занимались разработкой, то эта книга – отличный старт. Теория чередуется с практическими примерами и кодом – так вы сразу сможете связать абстрактные понятия с реальными ситуациями. В каждой главе вас ждут тесты и домашние задания, которые помогут закрепить материал.

#книга
👍281
Как работает UIScrollView

Статья о том, как работает UIScrollView, как реализованы замедление, баунс, spring animation и rubber band effect и как, применяя эти знания для собственных UI-компонентов, можно добиться естественной анимации и отзывчивого интерфейса в приложениях.
🔥8👍5👏31
‘Factory Method’ Pattern in Swift

Шаблон «Фабричный метод» — это творческий шаблон проектирования, который абстрагирует процесс создания экземпляров. Шаблон создания контролирует, кто создает объект и что/как/когда он создается.

Этот шаблон следует использовать, когда у нас есть много разных объектов, которые мы используем по-разному. Их экземпляры могут быть сложными и требовать вычислений для их создания. Шаблон «Фабричный метод» инкапсулирует их экземпляры, чтобы упростить их создание в разных местах

Этот шаблон следует использовать, когда логика создания и создание экземпляров выполняются клиентом. Клиент тесно связан с объектом, если его тип используется в его классе. Перемещая логику и инстанцирование объектов в подкласс, мы защищаем код от изменений API. Если к конкретному классу и его API добавляются какие-то модификации, на клиентский код не влияют изменения, которые ему не нужны. Реализуя интерфейс, фабричный метод возвращает абстракцию, а не конкретный тип, поэтому мы защищаем код от деталей реализации.
👍54🔥3😁1🤯1
Большой источник информации про UI в UIKit.

Мы привыкли воспринимать UI как визуальную составляющую, но ведь UI – это User Interface. Так вот, интерфейс – это то, с помощью чего пользователь взаимодействует с нашим приложением. В случае с графическим интерфейсом пользователь его видит и воспринимает информацию. Однако он не интерактивный и, когда пользователь хочет взаимодействовать с ним, он использует другие интерфейсы: тачскрин, клавиатуру или мышку. Да, это тоже интерфейсы. И UIKit как раз таки отвечает не за графический интерфейс, а за распознавание пользовательских жестов и их обработку.

В данной статье, вы улучшите свои знания про Core Graphics & Metal, Responder Chain, UIView и CALayer, frame/bounds, Content, Coordinate System, Visual Effects, Shadow, Mask, Scale.
👍9🔥41
Как устроен счетчик ссылок в Swift

В процессе выполнения приложения в памяти создается множество объектов. И если продолжать создавать объекты и не удалять лишние, тогда память закончится. Чтобы этого избежать, нужен алгоритм освобождения памяти. Главный его принцип – это отслеживание достижимости объекта. То есть, когда на объект есть ссылки, то он считается достижимым. А пока на объект хоть кто-то ссылается – значит его нельзя удалять из памяти. И как только пропадет последняя ссылка, то объект уничтожается и освобождается занятая им память.

Для отслеживания доступности объекта нужен алгоритм отслеживания активных ссылок. В Swift этот алгоритм реализован в виде механизма автоматического подсчета ссылок. Automatic Reference Counter, или сокращенно ARC – появился еще со времен Objective-C. В его основе счетчик ссылок, который есть у каждого объекта класса.

Более глубже и подробно про ARC, виды ссылок, side table, жизненный цикл объекта, битовое поле можно прочитать в данной статье
👍122🔥1
Пишем свой сетевой слой на Swift: протокол-ориентированный подход

Сейчас практически 100% приложений используют работу с сетью, поэтому вопрос организации и использования сетевого слоя встает перед каждым. Есть два основных подхода к решению этой проблемы, это либо использование сторонних библиотек, либо собственная реализация сетевого слоя. В данной статье расматривается именно второй вариант, реализуется сетевой слой с использованием всех последних возможностей языка, применяя протоколы и перечисления. Это избавляет проект от лишних зависимостей в виде дополнительных библиотек. Те, кто хоть раз видел Moya, сразу узнают множество схожих деталей в реализации и использовании, так оно и есть, не трогая Moya и Alamofire.

Статья для просмотра
🔥12👍52
Создание Custom BottomSheet

В данной статье происходит реализация создания кастомного BottomSheet c реализацией распознования жестов, ограничения движения и добавление анимации при завершения касания.
👍53🔥3
iOS Run Loop: Что? Когда? Зачем?

Run Loop (цикл исполнения) является механизмом, который позволяет потокам обрабатывать события (events) бесконечно в любое время.

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

Когда следует использовать цикл исполнения?
Cocoa предоставляет код для запуска основного цикла (main loop) программы и автоматического запуска цикла исполнения. Метод запуска UIApplication в программе IOS (или NSApplication в Mac OS X) используется как часть этапа запуска программы. Он запустит основной цикл программы, когда будет завершен ее запуск.

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

Интересные статьи про Run Loop: статья, статья
6🔥3👍2