#ui
How to force two lines of Text in SwiftUI (2 мин)
🗣 Как ограничить максимально UILabel мы знаем, а как выставить минимум строк?
Ловите небольшую статью с оригинально простым способ это сделать в SwiftUI. Можно также дополнить свой набор вспомогательных extensions
How to force two lines of Text in SwiftUI (2 мин)
🗣 Как ограничить максимально UILabel мы знаем, а как выставить минимум строк?
Ловите небольшую статью с оригинально простым способ это сделать в SwiftUI. Можно также дополнить свой набор вспомогательных extensions
🔥5👎3👍2
#ui
Swift Size Class that can be understood in 3 seconds (3 секунды)
🗣 Разбор метрик compact и regular в Size Classes. Как определить положение девайса по этим характеристикам?
Эти характеристики позволяют намного более точно настраивать лэйауты элементов как в UIKit, так и в SwiftUI.
Расскажите, когда вам приходилось их использовать?
Swift Size Class that can be understood in 3 seconds (3 секунды)
🗣 Разбор метрик compact и regular в Size Classes. Как определить положение девайса по этим характеристикам?
Эти характеристики позволяют намного более точно настраивать лэйауты элементов как в UIKit, так и в SwiftUI.
Расскажите, когда вам приходилось их использовать?
🔥6👎3
#ui
The Developer's Guide to Cell Content Configuration in iOS 14 (7 минут)
🗣 Разбор нововведения iOS 14 в отношении стандартной UITableViewCell
Давно писали cell.textLabel?.text = ...
Для тех, кто в танке (как я 😅), разработчики Apple решили все-таки внедрить по умолчанию то, что мы обычно писали сами, а именно возможность конфигурировать ячейки. Пожалуйста, новые протоколы: UIContentConfiguration, UIContentView
The Developer's Guide to Cell Content Configuration in iOS 14 (7 минут)
🗣 Разбор нововведения iOS 14 в отношении стандартной UITableViewCell
Давно писали cell.textLabel?.text = ...
Для тех, кто в танке (как я 😅), разработчики Apple решили все-таки внедрить по умолчанию то, что мы обычно писали сами, а именно возможность конфигурировать ячейки. Пожалуйста, новые протоколы: UIContentConfiguration, UIContentView
👎3🔥2👍1
#ui #swift #ios
New in iOS 16 — Self-resizing UICollectionView Cells (3 минуты)
🗣 В iOS 16 разработчикам наконец станет легче работать с размерами ячеек Table View or Collection View
НА WWDC 2022 Apple анонсировали важное улучшение фреймворка UIKit. Теперь ячейки Table View и Collection View самостоятельно подстраиваются под размер контента через аттрибут selfSizingInvalidation (true по умолчанию)
Изменения размеров ячеек можно через метод invalidateIntrinsicContentSize() с анимацией и через этот метод внутри UIView.performWithoutAnimation без анимации
New in iOS 16 — Self-resizing UICollectionView Cells (3 минуты)
🗣 В iOS 16 разработчикам наконец станет легче работать с размерами ячеек Table View or Collection View
НА WWDC 2022 Apple анонсировали важное улучшение фреймворка UIKit. Теперь ячейки Table View и Collection View самостоятельно подстраиваются под размер контента через аттрибут selfSizingInvalidation (true по умолчанию)
Изменения размеров ячеек можно через метод invalidateIntrinsicContentSize() с анимацией и через этот метод внутри UIView.performWithoutAnimation без анимации
👎3👍2
This media is not supported in your browser
VIEW IN TELEGRAM
Fade the First and Last Elements in a UICollectionView
Как создать fade анимацию для UICollectionView нужно:
👉 В ячейке сделать функцию с анимированным fade'ом
👉 Во viewController'е реализуем
где получаем видимые ячейки
а затем проверяем, видимы ли они целиком
Если нет, то активируем анимацию в ячейке
#UI
Как создать fade анимацию для UICollectionView нужно:
👉 В ячейке сделать функцию с анимированным fade'ом
func updateCell(faded: Bool, animated: Bool = true)
👉 Во viewController'е реализуем
func scrollViewDidScroll(_ scrollView: UIScrollView)
,где получаем видимые ячейки
self.collectionView.indexPathsForVisibleItems
а затем проверяем, видимы ли они целиком
collectionView.bounds.contains(cellRect)
Если нет, то активируем анимацию в ячейке
#UI
❤3👎1
How to create Rounded Corners Button in UIKit
В iOS 15, появились новые способы задать скругления кнопки через UIButton.Configuration:
👉 Через встроенный стиль со скругленными углами UIButton.Configuration.filled()
👉 Если дефолтное скругление не устраивает, можно задать cornerStyle у UIButton.Configuration (примеры на скрине)
👉 Если нужно задать определенное значение скругления, используйте configuration.background.cornerRadius, а затем установите configuration.cornerStyle в .fixed
#UI
В iOS 15, появились новые способы задать скругления кнопки через UIButton.Configuration:
👉 Через встроенный стиль со скругленными углами UIButton.Configuration.filled()
👉 Если дефолтное скругление не устраивает, можно задать cornerStyle у UIButton.Configuration (примеры на скрине)
👉 Если нужно задать определенное значение скругления, используйте configuration.background.cornerRadius, а затем установите configuration.cornerStyle в .fixed
#UI
👎3👍2
Создание анимаций для навигации в iOS
Можно использовать UIViewControllerAnimatedTransitioning для переходов в
В статье подробно описан первый случай
#UI
Можно использовать UIViewControllerAnimatedTransitioning для переходов в
UINavigationController
, для переходов посредством present
и dismiss
контроллеров, а даже для переходов между экранами UITabBarController
. В статье подробно описан первый случай
#UI
🔥2👍1👎1
iOS: Навигация по-новому
По мере развития SwiftUI основной компонент навигации NavigationView был заменен на NavigationStack.
В чем суть: теперь навигация становится возможной даже при помощи передачи пути для навигации. Те кто пользовался DeepLink или UniversalLink возрадуются. Теперь и на их улице будет праздник.
Вся навигация сводится к передаче массива с условными названиями экранов в переменную пути. NavigarionStack пройдет все цепочку навигации автоматически, и покажет последний экран в цепочке.
#ui
По мере развития SwiftUI основной компонент навигации NavigationView был заменен на NavigationStack.
В чем суть: теперь навигация становится возможной даже при помощи передачи пути для навигации. Те кто пользовался DeepLink или UniversalLink возрадуются. Теперь и на их улице будет праздник.
Вся навигация сводится к передаче массива с условными названиями экранов в переменную пути. NavigarionStack пройдет все цепочку навигации автоматически, и покажет последний экран в цепочке.
#ui
👍8👎2
How to change Status Bar text color in iOS (2 мин)
Два способа поменять цвет текста в статус баре:
👉 Для всего приложения: в Info.plist добавить ключ "Status bar style" и задать значение "Light Content" или "Dark Content", затем добавить ключ "View controller-based status bar appearance" и установить значение "NO"
👉 Для отдельного view controller'а с помощью
При этом в info.plist установить значение ключа "View controller-based status bar appearance" в YES или убрать ключ.
#ui
Два способа поменять цвет текста в статус баре:
👉 Для всего приложения: в Info.plist добавить ключ "Status bar style" и задать значение "Light Content" или "Dark Content", затем добавить ключ "View controller-based status bar appearance" и установить значение "NO"
👉 Для отдельного view controller'а с помощью
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
При этом в info.plist установить значение ключа "View controller-based status bar appearance" в YES или убрать ключ.
#ui
👍6👎1
Стоит ли переходить с UIKit на SwiftUI? Опыт СберМаркета
👉 Если вы собираетесь писать новый проект, то автор рекомендует этот фреймворк
👉 Если это старый проект, то можно переписать некоторые компоненты на UIKit, вынося их, для начала, в отдельные ViewController’ы, и добавляя с помощью addSubview в родительский VC, а после уже полностью переписывать на SUI и оборачивать в UIHostingController.
Сам по себе SwiftUI не страшен, но есть ещё неизведанные территории и редкие баги, с которыми можно справиться, если внимательно читать документацию. По скорости разработки SwiftUI по большей части обходит UIKit, хотя сначала нужно набить руку и познакомиться с фреймворком.
#ui
👉 Если вы собираетесь писать новый проект, то автор рекомендует этот фреймворк
👉 Если это старый проект, то можно переписать некоторые компоненты на UIKit, вынося их, для начала, в отдельные ViewController’ы, и добавляя с помощью addSubview в родительский VC, а после уже полностью переписывать на SUI и оборачивать в UIHostingController.
Сам по себе SwiftUI не страшен, но есть ещё неизведанные территории и редкие баги, с которыми можно справиться, если внимательно читать документацию. По скорости разработки SwiftUI по большей части обходит UIKit, хотя сначала нужно набить руку и познакомиться с фреймворком.
#ui
👍13👎6
Жизненный цикл UIViewController
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
Вспомним и закрепим еще раз с наглядной схемой:
👉 init
👉 loadView - создание view
👉 viewDidLoad - viewController создан, Outlets на месте
👉 viewWillAppear - view будет добавлено в иерархию отображения
👉 viewWillLayoutSubViews - каждый раз, когда изменяется frame
👉 viewDidLayoutSubviews - view только что разместило свои subview
👉 viewDidAppear - после того, как ViewController появляется на экране
👉 viewWillDisappear - до того, как viewController будет удален с экрана
👉viewDidDisappear - после удаления viewController'a с экрана
👉 deinit
#ui
🔥19👎2👍1
Bottom sheet: Navigation
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
В статье описано, как создать полноценную навигацию в рамках bottom sheet отображения, основанного на autolayout, а не на неудобном ручном расчёте высоты. Повторили анимации навигационных переходов. Добавили navigation bar как нативный способ управления навигацией.
#ui
👍10👎2
How We Centrally Manage UITabBar in Our iOS Apps
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
👉 Управление показом/скрытием в одном месте.
#ui
(4 мин)
Иногда бывает нужно скрыть UITabBar. Авторы делятся опытом реализации и дают следующие советы по управлению UITabBar:
👉 Единый метод для показа/скрытия UITabBar вместо
hidesBottomBarWhenPushed
, tabbar.isHidden
или tabbar.frame
👉 Управление показом/скрытием в одном месте.
MainTabBarNavigationManager: UINavigationControllerDelegate
и задать его делегатом для всех navigation controller'ов#ui
👍4👎1
Coordinator pattern with Tab Bar Controller
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
Как настроить навигацию в iOS приложении, где есть различные флоу и UITabBarController?
👉 Создаем AppCoordinator - это главный координатор приложения. Он должен быть строго один❗️
👉 AppCoordinator будет открывать и хранить в childCoordinators основные флоу. Например, Login и TabBar
👉 Каждый последующий флоу может иметь собственный координатор, открывать новые флоу и сохранять их в свои childCoordinators
👉 Каждый координатор в методе start() открывает новый флоу на родительском, а в методе finish() - закрывает и говорит родительскому координатору взять на себя управление после закрытия
👉 TabBarCoordinator открывает несколько флоу одновременно для каждого таба и умеет переключать эти табы
#ui
❤12
This media is not supported in your browser
VIEW IN TELEGRAM
clipped() не оказывает влияния на проверку касаний
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
Модификатор clipped() в SwiftUI обрезает вью до своих(модификатора) границ, скрывая все, что выходит за пределы этих границ. Но обратите внимание, что обрезание не влияет на проверку касаний (hit testing); обрезанный вью по-прежнему принимает тапы / клики за пределами видимой области.
#ui
👍8👎2
Learn iOS Custom View Controller Animation Transition once for all!
Если надоели нативные анимации при переходах между экранами, то можно украсить свое приложение новыми анимированными переходами в 4 шага:
👉 Сначала создадим наши анимации для открытия и закрытия экрана:
👉 Унаследуем оба класса от
👉 Теперь создадим класс-делегат
👉 Ну и теперь осталось присвоить делегат ViewController-у в методе:
#ui
Если надоели нативные анимации при переходах между экранами, то можно украсить свое приложение новыми анимированными переходами в 4 шага:
👉 Сначала создадим наши анимации для открытия и закрытия экрана:
SomePushAnimation
и SomePopAnimation
👉 Унаследуем оба класса от
UIViewControllerAnimatedTransitioning
и реализуем нужные методы👉 Теперь создадим класс-делегат
TransitionDelegate
, котрый будет возвращать наши уже созданные анимации для pop'a и push'a👉 Ну и теперь осталось присвоить делегат ViewController-у в методе:
override func viewDidLoad() {
super.viewDidLoad()
self.transitioningDelegate = transitionDelegate
}
#ui
🔥6👎1
Как мы разрешили использование Storyboard в iOS-разработке
Верстать в Xib и Storyboard для кого-то моветон, однако в статье с примерами рассказывают о преимуществах Storyboard:
👉 Меньше кода
👉 Меньше время компиляции (в эксперименте в 6.5 раз быстрее, чем при верстке кодом)
👉 Предварительный просмотр
👉 Предупреждения об ошибках
#ui
Верстать в Xib и Storyboard для кого-то моветон, однако в статье с примерами рассказывают о преимуществах Storyboard:
👉 Меньше кода
👉 Меньше время компиляции (в эксперименте в 6.5 раз быстрее, чем при верстке кодом)
👉 Предварительный просмотр
👉 Предупреждения об ошибках
#ui
👍8🤔4
The relationship between UIView and CALayer (1 мин)
Об отношениях UIView и CALayer:
👉 UIView наследуется от UIResponder, это базовый юнит иерархии view и контейнер для CALayer
👉 CALayer - sublayer UIView, который обрабатывает отрисовку и анимации содержимого view
👉 UIView контроллирует графику, анимации и верстку с помощью CALayer. Например, свойства frame, bounds и center UIView задаются соответствующими свойствами CALayer
👉 CALayer предоставляет множество свойств и функций, которых нет у UIView. Например, shadow, corner radius, border, gradient
#ui
Об отношениях UIView и CALayer:
👉 UIView наследуется от UIResponder, это базовый юнит иерархии view и контейнер для CALayer
👉 CALayer - sublayer UIView, который обрабатывает отрисовку и анимации содержимого view
👉 UIView контроллирует графику, анимации и верстку с помощью CALayer. Например, свойства frame, bounds и center UIView задаются соответствующими свойствами CALayer
👉 CALayer предоставляет множество свойств и функций, которых нет у UIView. Например, shadow, corner radius, border, gradient
#ui
👍6👎1
UICollectionViewCompositionalLayout (10 мин)
Compositional layouts - это декларативный вид API, который позволяет нам создавать большие макеты путем объединения небольших групп макетов.
Чтобы создать любой Compositional layouts, необходимо реализовать следующие четыре класса:
👉 NSCollectionLayoutSize
👉 NSCollectionLayoutItem - ячейка нашего макета
👉 NSCollectionLayoutGroup содержит NSCollectionLayoutItem в горизонтальной, вертикальной или пользовательской форма
👉 NSCollectionLayoutSection используется для инициализации секции путем передачи NSCollectionLayoutGroup
Подробнее о реализации читайте в статье
#ui
Compositional layouts - это декларативный вид API, который позволяет нам создавать большие макеты путем объединения небольших групп макетов.
Чтобы создать любой Compositional layouts, необходимо реализовать следующие четыре класса:
👉 NSCollectionLayoutSize
👉 NSCollectionLayoutItem - ячейка нашего макета
👉 NSCollectionLayoutGroup содержит NSCollectionLayoutItem в горизонтальной, вертикальной или пользовательской форма
👉 NSCollectionLayoutSection используется для инициализации секции путем передачи NSCollectionLayoutGroup
Подробнее о реализации читайте в статье
#ui
👍5❤1👎1