Xx
там прям про ui
Anton
о!
Xx
про дифы итп
Anton
да, перепутал с другим, сорри
Anton
вопрос только в лейауте
Anton
катана решает кастомным движком
Anton
Katana has its own language (inspired by Plastic) to programmatically define fully responsive layouts that will gracefully scale at every aspect ratio or size
Xx
ага у меня есть свой
Xx
LayoutOps
Xx
тоже умеет ноды считать, можно и в бэкграунде
Xx
ну autolayout в печку, никогда им не пользовался
Xx
но бонус просчитать всё и получить суперплавность решает
Anton
Я писал без него одно время.
Xx
тем более autolayout имеет далеко не самое приятное api
Anton
Пришел к бажному автолейауту, в котором была половина функциональности от нативного минус визуальный редактор
Anton
Сейчас пофиксили апи
Anton
есть анкоры
Anton
есть фреймворки поверх autolayout, в которых можно проще определить
Anton
когда у тебя айфон, айпад и две ориентации на каждом - мало приятного вручную считать
Xx
ну так вручную никто не считает
Xx
https://github.com/psharanda/LayoutOps/blob/master/README/DEMOS.md
Xx
autolayout не посчитаешь в background, не закэшируешь результаты
Anton
Да, есть такое
Anton
Поэтому кастомные движки, да
Xx
есть еще asyncdisplaykit, но что-то они перебрали в нем
Xx
слишком сложно внутри
Anton
В принципе сам autolayout построен на опенсорсной библиотеке для решения уравнений в constraints
Anton
AsyncDisplayKit’s layout engine is both one of its most powerful and one of its most unique features. Based on the CSS FlexBox model, it provides a declarative way of specifying a custom node’s size and layout of its subnodes. While all nodes are concurrently rendered by default, asynchronous measurement and layout are performed by providing an ASLayoutSpec for each node.
Anton
Неудивительно :)
Anton
что внутри сложно
Anton
Но я думаю эппл тоже к этому придет
Anton
Учитывая что по сути constraints - это и есть стейт
Xx
можно добиться всего этого меньшей кровью
Anton
и его несложно собрать, сохранить и применить
Xx
не переписывая пол uikit
Anton
В идеале ты даже не заметишь
Anton
Ты делаешь функции для смены constraints в каждом элементе как в реакте, потом все это собирается движком и процессится в новый стейт
Xx
ну не знаю, так что-то сходу не складывается как apple может не ломая всё вставить фоновый layout и кэширование
Anton
Сейчас ты после смены констрейнтов вызываешь апдейт, но легко сделать так, чтобы система сама это делала
Anton
Почему нет?
Anton
Immutable data structures в констреинтах
Anton
и пожалуйста
Anton
делай что хочешь в фоне
Anton
потом скорми новый набор движку
Xx
чтобы посчитать layout нужны не только констренты но и вся иерархия вьюшек в которых выставлены такие вещи как текст, картинки, паддинги итп. чтобы за кэшировать резултаты надо быть увереным что иерархия не изменится при следующем проходе, а она может
Anton
Вот есть браузер. На вход подается грубо говоря XML, на выходе - картинка в окне.
Anton
Твой xib файл - тот же xml
Anton
пожалуйста, меняй иерархию, если у тебя весь стейт представлен в виде данных
Anton
потом отдашь движку новую иерархию целиком
Anton
он применит
Xx
не ну так можно конечно, если полность сделать новый tableview, жесткое api
Xx
но с текущим не выйдет
Xx
там правилам никто не следует
Xx
по-крайней мер нет гарантий, что следуют
Anton
ну смотри - иерархия в виде данных у тебя уже есть
Anton
это твои UIView
Xx
как пользователь tableview я могу накодить вообще без данных
Xx
или пихать в ячейки рандом всякий
Anton
Ну да
Anton
Это твой новый стейт
Anton
У тебя был старый стейт, стал новый
Anton
можно посчитать диф и отрендерить
Anton
диф можно стчитать в бекграунде
Anton
так же как и новые значения для геометрии view
Anton
Представь, что ты на каждом фрейме копируешь всю иерархию view
Anton
потом меняешь копию в своих контроллерах
Anton
потом из старой и новой можно дифы считать, кэшировать итд
Xx
что-то уже смешались дифы и кони. диф это набор операций чтобы превратить состояние_1 в состояние_2. дифы нет смысла кэшировать, они не используются дважды. диф это к примеру - 1. удалять row1 2. обновить секцию3 3. установить новый title
Anton
Ты можешь закэшировать старое состояние
Anton
Дифы это просто чтобы не обновлять всю иерархию
Xx
ладно пример. вот инженер apple, а вот есть tableview, как ему в нем закэшировать layout ячеек, чтобы автоматом у всех пользователей заработало в ios11. всё что он может делать это вызывать cellForIndexPath в фоне для невидимых ячеек, а также heightForRow, willDisplay, сделать ячейке layout, и вот он ок, таки получил слепок вьюшек. теперь он может не вызывать cellForIndexPath а использовать из кэша. но это полная жопа, то что этот инженер сделал. во-первых в фоне никто не ожидал что вызовется cellForIndexPath ,. а даже если с божьей помощью приложение не упало и вернуло норм данные, то где гарантии что пока доскролишь до закэшированого данные не поменялись и ячейка должна быть совсем другая. нюансов тысячи, апи tableview абсолютно не готово справиться с такой задачей в одиночку
Xx
всё что я хочу сказать, что с текущим апи ничего не сделаешь и надо городить аля asyncdisplaykit если хочешь кэшировать и считать вещи в фоне
Xx
может быть apple что-то выкатит
Xx
но это будет даже не uikit
Paks
Anton
погоди погоди
Anton
причем тут cellForIndexPath
Anton
и что ты хочешь закешировать
Anton
layout для несуществующих ячеек?
Anton
Это невозможно