# Почему не # pixel perfect? [Ссылка на доклад](https://hackmd.io/@dv0MYzVgRIuMiLqpNVkLEg/Syfz_fbIo) --- ### Краткие ответы на некоторые "Почему не?" вопросы --- ## Почему не ## нативная разработка? - Две платформы - две команды --- ## Нативная разработка - В два раза дороже - В два раза больше коммуникаций - В два раза больше компромиссов - Не используется системный функционал ![](https://i.ibb.co/1z2My9D/ios-vs-android.jpg =400x) --- ## Кроссплатформа - Возможность кросс-ревью с вебом - Избежать конкуренции с банком в найме нативщиков - Одно решение для двух платформ ![](https://i.ibb.co/YcvBscK/andros.jpg =400x) --- ## Почему не ## другой фреймворк? - Популярность технологии - Примеры крупных проектов - Возможность выйти за рамки --- ## Популярность ![](https://i.ibb.co/q19BB77/Pasted-image-20221116135816.png =600x) --- ## Flutter ## Примеры крупных проектов ![](https://i.ibb.co/BC7VX22/flutter-top-projects.png =650x) --- ## React native ## Примеры крупных проектов ![](https://i.ibb.co/ZSVMG9K/RNN-top-projects.png =650x) --- ## Выйти за рамки сложно Но возможно использовать нативные api - Оплата - Пуши ![](https://i.ibb.co/WFfB9V2/Pasted-image-20221116140210.png =600x) --- ![](https://i.ibb.co/khRyms6/react-native-logo-884x1024.webp =500x) --- ## React to native Превращаем результат работы React в нативные представление --- Превращаем `<View>` в Web | iOS | Android :----------------:|:------------------:|:------------------: `<div>` | `UIView` | `android.view` --- --- ## На самом деле все сложнее Например наследование стилей отсутствует Реализовано только очень ограниченно для текста <span style="font-size:23px"> ```jsx <Text style={styles.bold}> I am bold <Text style={styles.red}> and red</Text> </Text> ``` </span> Превращается в нечто совершенно иное <span style="font-size:23px"> ```swift! let fAttributes = [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 36)] let sAttributes = [NSAttributedString.Key.foregroundColor: UIColor.red] let fString = NSMutableAttributedString(string: "I am bold ", attributes: fAttributes) let sString = NSAttributedString(string: " and red", attributes: sAttributes) firstString.append(secondString) ``` </span> --- #### Фреймворк пытается подружить различия #### И привести к общему знаменателю ![](https://i.ibb.co/YWL5Z99/Pasted-image-20221123124141.png =400x) --- #### Но иногда не понимает как это сделать #### И оставляет решение за нами ```javascript! import { Platform } from 'react-native'; if (Platform.OS === 'android' && Platform.Version >= 29) { console.log('Андроид 10, не меньше!'); } if (Platform.OS === 'ios') { console.log("Ммм, айфон!") } ``` --- #### Скорее исключение ```javascript if (isAndroid) { transparentBorders } ``` ![](https://i.ibb.co/yFrHNfH/Pasted-image-20221123113830.png =400x) --- ## Ожидания и реальность ![](https://i.ibb.co/zHF0MBB/haircut-e-v-r.jpg =400x) --- ## Пример компонента в коде Макет - 12 | Приложение - 10 :----------------:|:------------------: ![](https://i.ibb.co/JntPCxC/Pasted-image-20221115091537.png =300x)|![](https://i.ibb.co/W2fTT1m/Pasted-image-20221118154510.png =300x) ```javascript <Картинка /> <View style={contentWithCover}> <Texts.BodyM>{"Путешествия по миру 16.01.19"}</Texts.BodyM> <Texts.Heading3>{"Что посмотреть в Париже за один день"}</Texts.Heading3> <Bubble count={17} /> </View> ``` --- Отступы и цвета ```css .contentWithCover { paddingBottom: Spacing.size20, paddingHorizontal: Spacing.size20, borderBottomLeftRadius: Spacing.size15, borderBottomRightRadius: Spacing.size15, backgroundColor: getDynamicColor(ColorTokens.SURFACE_PRIMARY), }, ``` --- ## Почему не ## совпадают отступы ![](https://i.ibb.co/yPZRs2g/alien-professor.jpg =350x) --- ## Отличается реализация И отступы не должны совпадать Макет отцентрован ![](https://i.ibb.co/HgPzvDg/Pasted-image-20221116095658.png) --- Приложение ```javascript <ImageBackground> <View style={отступСлева: 2}> <Bubble count={21} /> </View> </ImageBackground> ``` --- #### По разному работает на разных системах ```javascript if (isAndroid) { transparentBorders } ``` ![](https://i.ibb.co/yFrHNfH/Pasted-image-20221123113830.png =400x) --- ## Макет статический а приложение динамическое ![](https://i.ibb.co/2hbkbcg/Pasted-image-20221123130259.png =300x) --- ## Отличаются токены дизайн системы --- ## Токены отступов в дизайне Дизайн | Приложение :----------------:|:------------------: ![](https://i.ibb.co/WscXKZp/Pasted-image-20221114093706.png =95x) | ![](https://i.ibb.co/XxXQ59d/Pasted-image-20221114093545.png =290x) --- ## Токены бордер радиуса Дизайн | Приложение :----------------:|:------------------: ![](https://i.ibb.co/Wzz2Y4x/Pasted-image-20221114093753.png =700x) | ![](https://i.ibb.co/Qp9vNfQ/Pasted-image-20221114093912.png)![](https://i.ibb.co/wr5kSBg/Pasted-image-20221114093942.png)![](https://i.ibb.co/5KprkFh/Pasted-image-20221114094014.png)![](https://i.ibb.co/whJh5L4/Pasted-image-20221114094214.png) --- ## Почему не ## выровнен текст по вертикали --- ## Дизайн токены совпадают Заголовки в дизайн-системе ![](https://i.ibb.co/YtRNytF/Pasted-image-20221118091552.png =300x) Заголовки в коде ```javascript [TextPresets.HEADING1]: { fontSize: FontSize.HEADING1, lineHeight: LineHeight.HEADING1, fontWeight: FontWeight.bold, color: SURFACE_ON_PRIMARY_COLOR, } ``` ![](https://i.ibb.co/MRGPp0k/Pasted-image-20221118091648.png =350x) --- ### Высота текста складывается из различных параметров шрифта ![](https://i.ibb.co/wcggNRr/baseline.png) --- ## Текст в приложении это не только текст ![](https://i.ibb.co/ngS5bP5/Pasted-image-20221117171124.png) --- ## Внутри этой коробочки ## текст может располагаться по разному ![](https://i.ibb.co/qRfsSrQ/animation.gif =400x) --- ## Android и iOS считают lineHeight по разному ![](https://i.ibb.co/LvP4nbj/line-height-difference.webp =600x) --- ## Токены цветов Токены | Цветовая тема :----------------:|:------------------: ![](https://i.ibb.co/GJGnHVS/Pasted-image-20221121092128.png =350x)|![](https://i.ibb.co/p4chM36/Pasted-image-20221121092436.png =200x) --- ## Почему не ## Svg - Svg не поддерживается из коробки - В iOS поддержку добавили в 2020 - Xcode 12 Используем png --- ## Отличия от веба Веб отличается от веба - Движок не вечнозеленый - Обратная совместимость - Использование того, что точно поддерживается - Предоставляемые фреймворком компоненты - отличаются аттрибуты - Верстка только flex --- ## Отличия от веба - Батарейка - Ширина экрана - перенестись может все что угодно - Интернет может отсутствовать, но приложение продолжит работать - Траффик и скорость --- ## Dev-tools существуют Хоть и не такие удобные как в вебе ![](https://i.ibb.co/GvpvFVr/Pasted-image-20221121095605.png =800x) --- ## Сcылки [Ссылка сюда](https://hackmd.io/@dv0MYzVgRIuMiLqpNVkLEg/Syfz_fbIo) [Медуза и флаттер](https://habr.com/ru/company/meduza/blog/501786) [Andoroid and iOS text quirks](https://codeburst.io/react-native-quirks-2fb1ae0bbf80) ---
{"metaMigratedAt":"2023-06-17T14:31:42.645Z","metaMigratedFrom":"YAML","title":"React native design talk","breaks":true,"description":"Why not perfect pixel.","contributors":"[{\"id\":\"76fd0c63-3560-448b-8c88-baa935590b12\",\"add\":14401,\"del\":7013}]"}
    420 views