Руководство по пользовательскому макету UICollectionView
UICollectionView, представленный в iOS 6, стал одним из самых популярных элементов пользовательского интерфейса среди разработчиков iOS. Что делает его таким привлекательным, так это разделение между уровнями данных и представления, которое зависит от отдельного объекта для обработки макета. Затем макет отвечает за определение размещения и визуальных атрибутов представлений.
В данной статье автор реализует UICollectionView, по примеру приложения Pinterest
В процессе вы узнаете:
1️⃣О пользовательских макетах.
2️⃣Как вычислять и кэшировать атрибуты макета.
3️⃣Как обрабатывать ячейки с динамическим размером.
Приятного чтения!
UICollectionView, представленный в iOS 6, стал одним из самых популярных элементов пользовательского интерфейса среди разработчиков iOS. Что делает его таким привлекательным, так это разделение между уровнями данных и представления, которое зависит от отдельного объекта для обработки макета. Затем макет отвечает за определение размещения и визуальных атрибутов представлений.
В данной статье автор реализует UICollectionView, по примеру приложения Pinterest
В процессе вы узнаете:
1️⃣О пользовательских макетах.
2️⃣Как вычислять и кэшировать атрибуты макета.
3️⃣Как обрабатывать ячейки с динамическим размером.
Приятного чтения!
❤11🔥3👍2
Жизненный цикл приложения
Основная функция
Входной точкой входа в каждом приложении основанном на C является функция main. В iOS приложениях это правильно так же соблюдается. Единственное чем отличается, это то, что в iOS приложении вы не должны писать в функцию main самостоятельно. Xcode создает эту функцию как часть основы для вашего проекта. Правда, в языке Swift такой функции уже не наблюдается.
Основной цикл работы
Основной цикл работы приложения обрабатывает все пользовательские события. Объект UIApplication запускает основной цикл с момента запуска и использует его для обработки событий и обработки изменений в интерфейсе. Как следует из названия, основной цикл выполняется в основном потоке приложения. Такое поведение гарантирует, что события связные с пользователем будут обрабатываться последовательно в том порядке в котором они были получены.
Продолжение, читаем в статье🫶🏻
Основная функция
Входной точкой входа в каждом приложении основанном на C является функция main. В iOS приложениях это правильно так же соблюдается. Единственное чем отличается, это то, что в iOS приложении вы не должны писать в функцию main самостоятельно. Xcode создает эту функцию как часть основы для вашего проекта. Правда, в языке Swift такой функции уже не наблюдается.
Основной цикл работы
Основной цикл работы приложения обрабатывает все пользовательские события. Объект UIApplication запускает основной цикл с момента запуска и использует его для обработки событий и обработки изменений в интерфейсе. Как следует из названия, основной цикл выполняется в основном потоке приложения. Такое поведение гарантирует, что события связные с пользователем будут обрабатываться последовательно в том порядке в котором они были получены.
Продолжение, читаем в статье🫶🏻
🔥8👍3❤2🎉2
MVI в iOS-приложении
Что делать если пишешь код, а в итоге получаешь настолько большой модуль, что полностью теряешь над ним контроль. И всё это добро изменяется со страшным скрипом, расширяется медленно и совсем не покрывается тестами.
В данной статье с примерами рассказываются подходы, способы как избежать этого.
MVI — это просто реализация стейт-машины, которая не сильно завязана на конкретную архитектуру и может быть применима в разных местах приложения.
Что делать если пишешь код, а в итоге получаешь настолько большой модуль, что полностью теряешь над ним контроль. И всё это добро изменяется со страшным скрипом, расширяется медленно и совсем не покрывается тестами.
В данной статье с примерами рассказываются подходы, способы как избежать этого.
MVI — это просто реализация стейт-машины, которая не сильно завязана на конкретную архитектуру и может быть применима в разных местах приложения.
❤3👍3
Что такое правильная архитектура iOS приложения?
Архитектурное решение подбирается индивидуально под каждый проект. Не существует волшебной пилюли, которая подойдет всегда и всем.
От чего же зависит выбор этого самого решения?
Основными факторами влияющими на проектирование архитектуры являются время поддержки проекта и его перспективы. Если проект собирается развиваться и его нужно будет долго поддерживать, то стоит заранее подумать о масштабируемой архитектуре.
MVC, MVVM, MVP… все это лишь UI дизайн паттерны, которые не были созданы для того, чтобы решать задачи всего приложения. Архитектура должна быть гибкой и позволять разработчикам быстро и легко адаптироваться под изменяющуюся окружающую среду.
Архитектура каждого проекта должна быть индивидуальной и зависеть исключительно от поставленных задач. Для мелких и простых проектов высокий уровень абстракции может стать попросту overengineering’ом.
Читать подробно
Архитектурное решение подбирается индивидуально под каждый проект. Не существует волшебной пилюли, которая подойдет всегда и всем.
От чего же зависит выбор этого самого решения?
Основными факторами влияющими на проектирование архитектуры являются время поддержки проекта и его перспективы. Если проект собирается развиваться и его нужно будет долго поддерживать, то стоит заранее подумать о масштабируемой архитектуре.
MVC, MVVM, MVP… все это лишь UI дизайн паттерны, которые не были созданы для того, чтобы решать задачи всего приложения. Архитектура должна быть гибкой и позволять разработчикам быстро и легко адаптироваться под изменяющуюся окружающую среду.
Архитектура каждого проекта должна быть индивидуальной и зависеть исключительно от поставленных задач. Для мелких и простых проектов высокий уровень абстракции может стать попросту overengineering’ом.
Читать подробно
❤6👍2
Протокольно-ориентированное программирование в Swift 5.1
Протоколы — фундаментальное свойство Swift. Они играют важную роль в стандартных библиотеках Swift и являются обычным способом абстракции кода. Во многом они похожи на интерфейсы в других языках программирования.
Протоколы позволяют группировать похожие методы, функции и свойства применительно к классам, структурам и перечислениям. При этом только классы позволяют использовать наследование от базового класса.
Преимущество протоколов в Swift состоит в том, что объект может соответствовать нескольким протоколам.
Ваш код при при использовании такого метода становиться более модульным. Думайте о протоколах как о строительных блоках функционала. Когда вы добавляете новую функциональность объекту, делая его соответствующим некоему протоколу, вы не делаете совершенно новый объект «с нуля», это было бы слишком долго. Вместо этого, вы добавляете разные строительные блоки до тех пор, пока объект не будет готов.
Подробнее можно прочитать в статье:
Протоколы — фундаментальное свойство Swift. Они играют важную роль в стандартных библиотеках Swift и являются обычным способом абстракции кода. Во многом они похожи на интерфейсы в других языках программирования.
Протоколы позволяют группировать похожие методы, функции и свойства применительно к классам, структурам и перечислениям. При этом только классы позволяют использовать наследование от базового класса.
Преимущество протоколов в Swift состоит в том, что объект может соответствовать нескольким протоколам.
Ваш код при при использовании такого метода становиться более модульным. Думайте о протоколах как о строительных блоках функционала. Когда вы добавляете новую функциональность объекту, делая его соответствующим некоему протоколу, вы не делаете совершенно новый объект «с нуля», это было бы слишком долго. Вместо этого, вы добавляете разные строительные блоки до тех пор, пока объект не будет готов.
Подробнее можно прочитать в статье:
❤9👍1🤔1
BottomSheet в iOS 15: возможности UISheetPresentationController
Как BottomSheet был реализован до iOS 15
Раньше приходилось пользоваться сторонними библиотеками или писать собственную реализацию. Оба варианта не лишены недостатков.
Сторонние библиотеки. Проблемой часто становилась ограниченность кастомизации. Решение: форкать репозиторий с библиотекой и вносить нужные изменений. Это наиболее распространённый вариант на проектах, которые мне встречались.
Собственная реализация. Предоставляет полную свободу, но нюансы отнимают много времени. Решение должно быть переиспользуемым: логично разделить его на контроллер-контейнер, который отвечает за представление, и контроллер с контентом, который находится внутри контейнера.
Что предлагает UI Kit в iOS 15. UISheetPresentationController? Читаем в статье
Как BottomSheet был реализован до iOS 15
Раньше приходилось пользоваться сторонними библиотеками или писать собственную реализацию. Оба варианта не лишены недостатков.
Сторонние библиотеки. Проблемой часто становилась ограниченность кастомизации. Решение: форкать репозиторий с библиотекой и вносить нужные изменений. Это наиболее распространённый вариант на проектах, которые мне встречались.
Собственная реализация. Предоставляет полную свободу, но нюансы отнимают много времени. Решение должно быть переиспользуемым: логично разделить его на контроллер-контейнер, который отвечает за представление, и контроллер с контентом, который находится внутри контейнера.
Что предлагает UI Kit в iOS 15. UISheetPresentationController? Читаем в статье
👍9🔥2❤1
Руководство по Push-уведомлениям для iOS
Что такое push-уведомления? Это сообщения, отправляемые в ваше приложение через службу push-уведомлений Apple (APNs), даже если ваше приложение не запущено или телефон находится в спящем режиме. Для чего вы можете использовать push-уведомления? Push-уведомления позволяют разработчикам связаться с пользователями, даже если пользователи не активно используют приложение!
- Отобразите короткое текстовое сообщение, называемое оповещением, которое привлекает внимание к чему-то новому в вашем приложении.
- Воспроизведение звукового уведомления.
- Показать вложение мультимедиа.
Как делать такие уведомления, вы можете прочитать в статьте, где автор подробно рассказывает про реализацию пушей.
Что такое push-уведомления? Это сообщения, отправляемые в ваше приложение через службу push-уведомлений Apple (APNs), даже если ваше приложение не запущено или телефон находится в спящем режиме. Для чего вы можете использовать push-уведомления? Push-уведомления позволяют разработчикам связаться с пользователями, даже если пользователи не активно используют приложение!
- Отобразите короткое текстовое сообщение, называемое оповещением, которое привлекает внимание к чему-то новому в вашем приложении.
- Воспроизведение звукового уведомления.
- Показать вложение мультимедиа.
Как делать такие уведомления, вы можете прочитать в статьте, где автор подробно рассказывает про реализацию пушей.
👍9❤1😱1
Как правильно пользоваться SnapKit?
Для тех кто только учится - это классный туторила, чтобы познать дзен SnapKit, а для других увидеть для себя что-то новое.
В этой статье вы узнаете про ограничения, как использовать правильно данную библиотеку, что такое начальные и конеченые ограничения, и когда лучше использовать левые и правые ограничения, и все это с примерами.
Статья
Для тех кто только учится - это классный туторила, чтобы познать дзен SnapKit, а для других увидеть для себя что-то новое.
В этой статье вы узнаете про ограничения, как использовать правильно данную библиотеку, что такое начальные и конеченые ограничения, и когда лучше использовать левые и правые ограничения, и все это с примерами.
Статья
🔥8👍4❤2🥰1🤔1
Списки захвата в Swift: в чём разница между ссылками weak, strong и unowned?
В данной статье вы узнаете особенности сильных, слабых и бесхозных ссылок, их различия и как правильно применять на практике.
В данной статье вы узнаете особенности сильных, слабых и бесхозных ссылок, их различия и как правильно применять на практике.
👍8🔥2❤1
5 сложных алгоритмов, упрощенных с использованием функций высшего порядка Swift
Как разработчику, очень часто нам приходится иметь дело со сложными алгоритмами, на разработку которых уходят часы или даже дни. Благодаря функциям высшего порядка Swift, таким как map, reduce, filter, и т.д., некоторые из этих сложных алгоритмов теперь могут быть легко решены всего несколькими строками кода.
В этой статье я хотел бы показать вам 5 алгоритмов, которые раньше было сложно реализовать, теперь чрезвычайно легко реализовать, благодаря функциям более высокого порядка в Swift.
Используя функции высшего порядка, мы можем значительно снизить сложность нашего кода, тем самым делая его менее подверженным ошибкам. Самое главное, это значительно упрощает обслуживание нашего кода.
Как разработчику, очень часто нам приходится иметь дело со сложными алгоритмами, на разработку которых уходят часы или даже дни. Благодаря функциям высшего порядка Swift, таким как map, reduce, filter, и т.д., некоторые из этих сложных алгоритмов теперь могут быть легко решены всего несколькими строками кода.
В этой статье я хотел бы показать вам 5 алгоритмов, которые раньше было сложно реализовать, теперь чрезвычайно легко реализовать, благодаря функциям более высокого порядка в Swift.
Используя функции высшего порядка, мы можем значительно снизить сложность нашего кода, тем самым делая его менее подверженным ошибкам. Самое главное, это значительно упрощает обслуживание нашего кода.
❤11👍2😁1🤔1
This media is not supported in your browser
VIEW IN TELEGRAM
Анимированный TabBar
В данной статье автор разбирает, как сделать кастомный, аниммированный TabBarController. Много практики, полезного кода, а самое главное что свой материал он группирует на следующие группы:
Классы и модели
Свойства BubbleTabBar
Инициализация и первая прорисовка
Общедоступные методы
Анимация
В данной статье автор разбирает, как сделать кастомный, аниммированный TabBarController. Много практики, полезного кода, а самое главное что свой материал он группирует на следующие группы:
Классы и модели
Свойства BubbleTabBar
Инициализация и первая прорисовка
Общедоступные методы
Анимация
❤8👍2🔥2
RxSwift и реактивное программирование
RxSwift решает проблемы изменяемого состояния, позволяет составлять последовательности событий и улучшает архитектурные концепции, такие как изоляция кода, возможность повторного использования и развязка. Основными строительными блоками кода Rx являются наблюдаемые операторы и планировщики.
Наблюдаемый
Rx - это общая абстракция вычислений, выраженная через интерфейс Observable<Element>, который транслирует и подписывается на значения и другие события из наблюдаемого потока. ObservableTypeПротокол (которому Observableсоответствует) чрезвычайно прост. An Observableможет излучать (а наблюдатели могут получать) только три типа событий:
Планировщики
Планировщики — это Rx-эквивалент очередей отправки или очередей операций - только на стероидах и гораздо проще в использовании. Они позволяют определить контекст выполнения конкретной части работы.
RxSwift поставляется с несколькими предопределенными планировщиками, которые охватывают 99% случаев использования и, надеюсь, означают, что вам никогда не придется создавать свой собственный планировщик.
RxSwift будет действовать как диспетчер между вашими подписками (слева внизу) и планировщиками (справа), отправляя части работы в правильный контекст и позволяя им беспрепятственно работать с выводами друг друга.
Архитектура приложений
Стоит отметить, что RxSwift никоим образом не изменяет архитектуру вашего приложения; в основном он имеет дело с событиями, асинхронными последовательностями данных и универсальным коммуникационным контрактом.
Почему RxSwift?
Если ваше приложение сильно реагирует на пользовательские интеграции, RxSwift здесь, чтобы очистить вашу огромную кодовую базу. Давайте посмотрим на пример того, как это выглядит с помощью RxSwift.
Статья
RxSwift решает проблемы изменяемого состояния, позволяет составлять последовательности событий и улучшает архитектурные концепции, такие как изоляция кода, возможность повторного использования и развязка. Основными строительными блоками кода Rx являются наблюдаемые операторы и планировщики.
Наблюдаемый
Rx - это общая абстракция вычислений, выраженная через интерфейс Observable<Element>, который транслирует и подписывается на значения и другие события из наблюдаемого потока. ObservableTypeПротокол (которому Observableсоответствует) чрезвычайно прост. An Observableможет излучать (а наблюдатели могут получать) только три типа событий:
Планировщики
Планировщики — это Rx-эквивалент очередей отправки или очередей операций - только на стероидах и гораздо проще в использовании. Они позволяют определить контекст выполнения конкретной части работы.
RxSwift поставляется с несколькими предопределенными планировщиками, которые охватывают 99% случаев использования и, надеюсь, означают, что вам никогда не придется создавать свой собственный планировщик.
RxSwift будет действовать как диспетчер между вашими подписками (слева внизу) и планировщиками (справа), отправляя части работы в правильный контекст и позволяя им беспрепятственно работать с выводами друг друга.
Архитектура приложений
Стоит отметить, что RxSwift никоим образом не изменяет архитектуру вашего приложения; в основном он имеет дело с событиями, асинхронными последовательностями данных и универсальным коммуникационным контрактом.
Почему RxSwift?
Если ваше приложение сильно реагирует на пользовательские интеграции, RxSwift здесь, чтобы очистить вашу огромную кодовую базу. Давайте посмотрим на пример того, как это выглядит с помощью RxSwift.
Статья
Medium
RxSwift and Reactive Programming
What is RxSwift?
❤8👍4🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Как временно закрыть весь экран вашего приложения
В этом коротком руководстве мы рассмотрим, как временно покрыть весь экран вашего приложения пользовательскими файлами UIView. В целом это имеет два основных варианта использования:
1️⃣ Затемнение фона для отображения всплывающего содержимого
2️⃣ Скрытие содержимого в переключателе приложений, чтобы скрыть потенциально конфиденциальную информацию или просто показать пользователю что-то веселое.
Оба работают одинаково, но код для отображения и скрытия этих представлений отличается.
Подробнее прочитать в данной статье
В этом коротком руководстве мы рассмотрим, как временно покрыть весь экран вашего приложения пользовательскими файлами UIView. В целом это имеет два основных варианта использования:
1️⃣ Затемнение фона для отображения всплывающего содержимого
2️⃣ Скрытие содержимого в переключателе приложений, чтобы скрыть потенциально конфиденциальную информацию или просто показать пользователю что-то веселое.
Оба работают одинаково, но код для отображения и скрытия этих представлений отличается.
Подробнее прочитать в данной статье
🔥5❤4👍2
Многопоточность Swift
Что такое процесс? Процесс - это программа, запущенная на вашем компьютере.
Что такое поток? Поток - это последовательность инструкций, которые могут выполняться средой выполнения.
Что такое основной поток? Каждый процесс имеет по крайней мере один поток. В iOS основной поток, в котором запускается процесс, обычно называется основным потоком
Что такое многопоточное приложение? Мы могли бы сказать, что приложение является многопоточным, поскольку оно использует более одного потока.
Для чего используется многопоточность? Многопоточность - это шаблон для повышения производительности приложения и планирования работы в нескольких потоках, параллельно можно выполнять больше работы.
Как мы можем добиться многопоточности?
Ваше устройство имеет несколько ядер процессора. Чтобы использовать эти ядра, вам нужно будет использовать несколько потоков. Параллельное выполнение работы также известно как параллелизм.
Подробно можно прочитать в данной статье
Что такое процесс? Процесс - это программа, запущенная на вашем компьютере.
Что такое поток? Поток - это последовательность инструкций, которые могут выполняться средой выполнения.
Что такое основной поток? Каждый процесс имеет по крайней мере один поток. В iOS основной поток, в котором запускается процесс, обычно называется основным потоком
Что такое многопоточное приложение? Мы могли бы сказать, что приложение является многопоточным, поскольку оно использует более одного потока.
Для чего используется многопоточность? Многопоточность - это шаблон для повышения производительности приложения и планирования работы в нескольких потоках, параллельно можно выполнять больше работы.
Как мы можем добиться многопоточности?
Ваше устройство имеет несколько ядер процессора. Чтобы использовать эти ядра, вам нужно будет использовать несколько потоков. Параллельное выполнение работы также известно как параллелизм.
Подробно можно прочитать в данной статье
❤9👍7
MVVM + POP для работы со сложным пользовательским интерфейсом
Компонент View (Примечание: UIViewController — это View) может иметь внутри ViewModel и полагаться только на него.
ViewModel : компонент, отвечающий за выполнение всей работы и подготовку данных для использования View. ViewModel может иметь в себе модель
Модель: модель данных или тип значения
Интерфейс/Протоколы/Абстракция — все это относится к одной и той же идее решения многих задач.
Протоколы в Swift на самом деле дают больше возможностей, например,
Вы можете создать протокол и иметь расширение для этого протокола, чтобы иметь реализацию по умолчанию.
Protocols позволяет писать расширяемый код. Например. У вас может быть расширение для существующих классов, перечислений и т. д. и добавление к нему дополнительных функций без создания подкласса.
Множественное наследование. Либо вы можете создать протокол, который наследуется от протокола или нескольких протоколов, либо вы можете согласовать несколько протоколов, что решает проблему множественного наследования. Пожалуйста, проверьте пример на изображениях, приведенных ниже.
Пример реализации МВВМ и ПОП можно посмотреть в данной статье
Компонент View (Примечание: UIViewController — это View) может иметь внутри ViewModel и полагаться только на него.
ViewModel : компонент, отвечающий за выполнение всей работы и подготовку данных для использования View. ViewModel может иметь в себе модель
Модель: модель данных или тип значения
Интерфейс/Протоколы/Абстракция — все это относится к одной и той же идее решения многих задач.
Протоколы в Swift на самом деле дают больше возможностей, например,
Вы можете создать протокол и иметь расширение для этого протокола, чтобы иметь реализацию по умолчанию.
Protocols позволяет писать расширяемый код. Например. У вас может быть расширение для существующих классов, перечислений и т. д. и добавление к нему дополнительных функций без создания подкласса.
Множественное наследование. Либо вы можете создать протокол, который наследуется от протокола или нескольких протоколов, либо вы можете согласовать несколько протоколов, что решает проблему множественного наследования. Пожалуйста, проверьте пример на изображениях, приведенных ниже.
Пример реализации МВВМ и ПОП можно посмотреть в данной статье
Medium
MVVM + POP to deal with complex UI
How to use MVVM with POP to code and solve issues while designing and coding complex UIs. with examples.
❤6👍2🔥1
Как создать собственный верхний и нижний колонтитулы с помощью UIHostingConfiguration
Когда Apple представляет UIHostingConfigurationна WWDC, они в основном фокусируются на демонстрации того, как мы можем использовать его для создания пользовательских ячеек для представления таблицы и коллекции. Это заставляет меня задаться вопросом, можно ли создать собственный верхний и нижний колонтитулы, используя файлы UIHostingConfiguration.
В данной статье вы можете посмотреть, как можно это реализовать. Практически, полезная штука, которая может применяться во многих кейсах.
Когда Apple представляет UIHostingConfigurationна WWDC, они в основном фокусируются на демонстрации того, как мы можем использовать его для создания пользовательских ячеек для представления таблицы и коллекции. Это заставляет меня задаться вопросом, можно ли создать собственный верхний и нижний колонтитулы, используя файлы UIHostingConfiguration.
В данной статье вы можете посмотреть, как можно это реализовать. Практически, полезная штука, которая может применяться во многих кейсах.
❤4
iOS swift — setNeedsLayout против layoutIfNeeded против layoutSubviews()
Когда запускается приложение iOS, UIApplication в iOS запускает основной цикл выполнения приложения, который выполняется в основном потоке. Основной цикл выполнения обрабатывает события (например, касания пользователя) и обрабатывает обновления интерфейсов на основе представлений. По мере возникновения событий, таких как касание, обновления местоположения, управление движением и мультимедиа, цикл выполнения находит соответствующий обработчик для событий, вызывая соответствующие методы, которые вызывают другие методы и так далее.
— setNeedsLayout()
Метод setNeedsLayout для UIView сообщает системе, что вы хотите, чтобы она разметила и перерисовала это представление и все его подвиды, когда пришло время для цикла обновления. Это асинхронное действие, потому что метод завершается и возвращается немедленно, но только через некоторое время макет и перерисовка действительно происходят, и вы не знаете, когда будет этот цикл обновления.
— layoutIfNeeded()
Напротив, метод layoutIfNeeded - это синхронный вызов, который сообщает системе, что вы хотите создать макет и перерисовать представление и его подвиды, и вы хотите, чтобы это было сделано немедленно, не дожидаясь цикла обновления. Когда вызов этого метода завершен, макет уже скорректирован и нарисован на основе всех изменений, которые были отмечены до вызова метода.
— layoutSubviews()
Реализация по умолчанию использует все ограничения, которые вы установили для определения размера и положения любых вложенных представлений.
Когда запускается приложение iOS, UIApplication в iOS запускает основной цикл выполнения приложения, который выполняется в основном потоке. Основной цикл выполнения обрабатывает события (например, касания пользователя) и обрабатывает обновления интерфейсов на основе представлений. По мере возникновения событий, таких как касание, обновления местоположения, управление движением и мультимедиа, цикл выполнения находит соответствующий обработчик для событий, вызывая соответствующие методы, которые вызывают другие методы и так далее.
— setNeedsLayout()
Метод setNeedsLayout для UIView сообщает системе, что вы хотите, чтобы она разметила и перерисовала это представление и все его подвиды, когда пришло время для цикла обновления. Это асинхронное действие, потому что метод завершается и возвращается немедленно, но только через некоторое время макет и перерисовка действительно происходят, и вы не знаете, когда будет этот цикл обновления.
— layoutIfNeeded()
Напротив, метод layoutIfNeeded - это синхронный вызов, который сообщает системе, что вы хотите создать макет и перерисовать представление и его подвиды, и вы хотите, чтобы это было сделано немедленно, не дожидаясь цикла обновления. Когда вызов этого метода завершен, макет уже скорректирован и нарисован на основе всех изменений, которые были отмечены до вызова метода.
— layoutSubviews()
Реализация по умолчанию использует все ограничения, которые вы установили для определения размера и положения любых вложенных представлений.
❤13👍5
Продвинутый дебаг в Xcode: средства отладки, про которые часто забывают
Каждый разработчик, независимо от квалификации и типа текущей задачи, постоянно находится в знакомом всем цикле: мы пишем код, запускаем и исправляем. Количество итераций у каждого разное, но делаем мы это ежедневно множество раз.
По данным некоторых исследований, мы в среднем тратим до 60% времени на отладку — и это именно усредненное значение, для кого-то, особенно для начинающих разработчиков, оно может быть ещё больше. Пост призван уменьшить это время и сделать процесс отладки эффективнее и приятнее.
Всем удачного дебагинга!
Каждый разработчик, независимо от квалификации и типа текущей задачи, постоянно находится в знакомом всем цикле: мы пишем код, запускаем и исправляем. Количество итераций у каждого разное, но делаем мы это ежедневно множество раз.
По данным некоторых исследований, мы в среднем тратим до 60% времени на отладку — и это именно усредненное значение, для кого-то, особенно для начинающих разработчиков, оно может быть ещё больше. Пост призван уменьшить это время и сделать процесс отладки эффективнее и приятнее.
Всем удачного дебагинга!
👍6❤3
Управление памятью в Swift
Помимо места, используемого для загрузки своего собственного байт-кода, программа использует при работе две области в оперативной памяти — стек (stack) и кучу (heap).
Стек
Stack — Переменные, выделенные в стеке, хранятся непосредственно в памяти, и доступ к этой памяти очень быстрый, и ее выделение определяется при компиляции программы.
Куча
Куча используется для динамического выделения памяти, однако, в отличие от стека, данные в куче первым делом требуется найти с помощью «оглавления». Можно представить, что куча это такая большая многоуровневая библиотека, в которой, следуя определённым инструкциям, можно найти необходимую книгу.
Подробное описание про память, советую прочитать данную статью
Помимо места, используемого для загрузки своего собственного байт-кода, программа использует при работе две области в оперативной памяти — стек (stack) и кучу (heap).
Стек
Stack — Переменные, выделенные в стеке, хранятся непосредственно в памяти, и доступ к этой памяти очень быстрый, и ее выделение определяется при компиляции программы.
Куча
Куча используется для динамического выделения памяти, однако, в отличие от стека, данные в куче первым делом требуется найти с помощью «оглавления». Можно представить, что куча это такая большая многоуровневая библиотека, в которой, следуя определённым инструкциям, можно найти необходимую книгу.
Подробное описание про память, советую прочитать данную статью
❤12👍3
Как упростить вёрстку интерфейса при помощи UIStackView
UIStackView - автоматический, скомпонованный объект, из него легко сделать адаптивный дизайн.
Представление стека использует автоматическую компоновку для позиционирования и размера упорядоченных представлений. Представление стека выравнивает первое и последнее упорядоченное представление с его краями вдоль оси стека. В горизонтальном стеке это означает, что передний край первого упорядоченного представления прикрепляется к переднему краю стека, а задний край последнего упорядоченного представления прикрепляется к заднему краю стека. В вертикальных стеках верхний и нижний края прикрепляются к верхнему и нижнему краям стека соответственно.
Разобрать UIStackView с примерами - можно в этой статье.
UIStackView - автоматический, скомпонованный объект, из него легко сделать адаптивный дизайн.
Представление стека использует автоматическую компоновку для позиционирования и размера упорядоченных представлений. Представление стека выравнивает первое и последнее упорядоченное представление с его краями вдоль оси стека. В горизонтальном стеке это означает, что передний край первого упорядоченного представления прикрепляется к переднему краю стека, а задний край последнего упорядоченного представления прикрепляется к заднему краю стека. В вертикальных стеках верхний и нижний края прикрепляются к верхнему и нижнему краям стека соответственно.
Разобрать UIStackView с примерами - можно в этой статье.
👍7🔥3❤1👏1
Структуры против Классов
1. В массив лучше всего класть структуры.
2 .Если хочется создать массив из классов, то лучше выбрать обычный Array, так как ContiguousArray предоставляет преимущества редко, и они не сильно высоки.
3. Inline оптимизация ускоряет работу, не отключайте её.
4. Доступ к элементам Array всегда быстрее, чем доступ к элементам ContiguousArray.
5. Структуры всегда быстрее классов (если конечно включить Whole module optimization или подобную оптимизацию).
6. При передаче объекта в функцию и вызове его свойства, начиная с третьего, структуры быстрее классов.
7. При передаче значения в функцию, написаную для Generic и Protocol, Generic будет быстрее.
8. При наследовании классов
скорость вызова функции деградирует.
9. Переменные с пометкой final работают медленнее обычных перечных.
10. Если функция принимает объект, объединяющий протоколом несколько объектов, то он будет быстро работать, если в нём хранится всего одно свойство, и сильно деградировать при добавлении большего количества свойств.
Статья:
1. В массив лучше всего класть структуры.
2 .Если хочется создать массив из классов, то лучше выбрать обычный Array, так как ContiguousArray предоставляет преимущества редко, и они не сильно высоки.
3. Inline оптимизация ускоряет работу, не отключайте её.
4. Доступ к элементам Array всегда быстрее, чем доступ к элементам ContiguousArray.
5. Структуры всегда быстрее классов (если конечно включить Whole module optimization или подобную оптимизацию).
6. При передаче объекта в функцию и вызове его свойства, начиная с третьего, структуры быстрее классов.
7. При передаче значения в функцию, написаную для Generic и Protocol, Generic будет быстрее.
8. При наследовании классов
скорость вызова функции деградирует.
9. Переменные с пометкой final работают медленнее обычных перечных.
10. Если функция принимает объект, объединяющий протоколом несколько объектов, то он будет быстро работать, если в нём хранится всего одно свойство, и сильно деградировать при добавлении большего количества свойств.
Статья:
❤12👍5