Найти в Дзене

Часть V: Затишье перед бурей

— А остальные пункты вашего резюме так же близки к истине, как и этот?
— В них столько правды, сколько вам угодно. Если резюме вас устраивает, оно правдиво. В противном случае я его перепишу.
Credits to Andreia Dobrota
Credits to Andreia Dobrota

Тишина. Вдалеке чуть слышно, как поют птички. Странно, что даже ветра нет. Погода в моем абстрактном мире просто великолепна. Я, у себя в голове, лежу в гамаке и немножко качаюсь из стороны в сторону. Прошло 19 дней с последней статьи - хотел написать раньше, но все думал, что нужно подкопить материала для нового блога. Правильно в народе говорят, что нужно уметь отпускать: так вот, накопилось столько, что уже не влезает в карманы, и я пришел делиться.

В прошлой статье, мое приложение toDoList создавался несколько раз с нуля - для того, чтобы понять логику будущего приложения и методом проб и ошибок найти ту самую формулу. Одним из первых прототипов была система, где в storyboard был TableView и уже к нему я добавлял новый UIView через код. В этой вьюшке я создал textfield, datePicker и две кнопки (1ая для выхода из вьюшки, 2ая для сохранения и передачи данных в tableView). Создал отдельные функции setupViews() и setupConstraints(), где я прописал addSubview() функции для добавления вьюшек и выставил constraints. Скажу честно, запускал приложение я очень много раз, чтобы понять как работают constraints, которые я прописал в setupConstraints(). Сама вьюшка всплывала через @IBAction, который был привязан к Tab Item.

Помню, как мы созвонились с ментором и сделали refactoring. После этого, он сказал, чтобы я начал писать логику выхода из вьюшки и передачи данных из textfield-а и datePicker-а в TableView. Я сказал, что это же легко сделать и мне нужно всего 10 минут, так как я уже делал это в предыдущих прототипах приложения, где я использовал segue. Договорились созвониться через 10 минут, и я приступил к написанию логики, думал попробовать через dismiss, который я уже использовал ранее, но он не работал, так как он может dismiss-нуть сам ViewController, а мне нужно было, чтобы только вьюшка исчезла. Время шло очень быстро, и я сидел не зная как это сделать. Перепробовал все, что знал на тот момент, но увы ничего не получалось. В голове была идея, но она казалась мне смешной и нелепой. Вспомнив слова известного детектива, которые гласили "Когда исключаются все возможности, кроме одной, эта последняя, сколь ни кажется она невероятной, и есть неоспоримый факт", я все-таки решил в самый последний момент реализовать эту идею: добавил target с selector-ом на функцию, где вьюшка скрывалась через isHidden. Не верил в эту идею, но решил сдать так. Когда созвонились, к моему удивлению, ментор сказал, что идея правильная и все работает. Можно было еще сделать через removeFromSuperview(), но пришлось бы создавать вьюшку снова и снова, когда юзер нажимал на плюсик (Tab Item). Осталось написать логику для передачи данных с вьюшки в TableView, который вскоре я реализовал через closure и в этот момент я понял, что пора прощаться с segue навсегда. Он как будто создан для ребенка новичка- покатайся на сигвее пока еще маленький, но потом учись ездить на машине.

Вскоре я решил, что надо делать все через код и нужно избавиться от самого storyboard-a. Как же классно было нажимать на кнопку Delete - типа я теперь от тебя не завишу: я сам по себе, а тебе желаю удачи. Удалив storyboard, первым делом, я откорректировал info.plist и AppDelegate, и приступил к заполнению самого ViewController-a. Я знал, что код в TableView будет не маленьким, поэтому решил создать отдельный файл, а потом уже наследоваться от него в ViewController-e. В финальной версии моего приложения, я решил избавиться от datePicker и вместо него вставить карусель из иконок, которые будут символизировать действие в списке дел. Решил еще заменить две кнопки и Tab Item, и создать вместо них другие две кнопки: первая кнопка будет плюсик, который при нажатии повернется и станет крестиком, а вторая кнопка будет добавлять введенные данные в TableView. Эти корректировки круто звучали на листе, но теперь нужно было это реализовать в Xcode.

Как раз в это время, началась моя первая конференция от Kolesa Group. Из-за пандемии организаторы решили провести ее онлайн и думаю, они справились, так как они быстро адаптировались реалиям и все прошло гладко. Скажу честно, что не все доклады были полезные для меня, но в целом я много что почерпнул, хотел бы выделить доклад на тему "App clips" от Даниса Тазетдинова. Самое главное, что я выиграл два набора мерча от них, сняв короткий ролик и вовремя заметив пасхалку на лекции:) А если серьезно, то я рад, что посетил эту конфу (спасибо ребятам из Kolesa Group), ведь самое главное в конфах - это networking, а не сами доклады. Плюс, вот эта атмосфера мотивирует тебя идти дальше несмотря ни на что.

Вернулся я в реальность после конференции заряженным и сразу приступил к своему проекту. Нужно было сделать анимацию появления и исчезания вьюшки, и чтобы крестик поворачивался на нужный градус. Благо мне, что я увлекаюсь filmmaking-ом, которая делится на несколько важных частей. Но самый мой любимый процесс - это монтаж, где ты сидишь и создаешь чудо; не зря говорят, что монтаж может спасти проект, даже если снято криво и сценарий с дырами. И если ты хочешь что-либо анимировать, то задаешь новую позицию координатами и время, через которое объект должен там оказаться. Такая же философия используется в swift. Решил использовать бесцветный container для кнопки и вьюшки, и анимировать только container через UIView.animate(), где уже использовал CGAffineTransform(). Затея с плюсиком/крестиком удалась и самое главное, что выглядит это все очень круто. Дизайн, точнее цветовую гамму, для приложения я взял с известного ресурса Dribbble, где талантливые люди выкладывают свои работы. Следующей задачей была анимировать вьюшку, когда всплывает клавиатура, чтобы keyboard не закрывал его. Существует несколько способов для реализации этой задачи. Я решил создать отдельный constraint для верхней части container и когда нужно, его менять на высоту клавиатуры. Еще нужно было сделать так, чтобы клавиатура уходила если тапнуть в любой части экрана, которую я реализовал через UITapGestureRecognizer. Срезал все углы у вьюшки через cornerRadius, но когда он поднимался из-за клавиатуры, были видны нижние углы, что я не хотел. Поэтому я написал функцию в расширении моей вьюшки, чтобы только topLeft и topRight срезались, и я вызвал эту функцию в viewWillLayoutSubviews(). Долго сидел с collectionView, где нужно было реализовать карусель и выделение ячейки, которая не работала из-за добавленной функции к тапу по экрану, чтобы клавиатура скрывалась. Эту проблему я решил, создав бесцветную вьюшку поверх TableView. Если клавиатура спрятана, то вьюшка isHidden, и наоборот. После этого, я добавил еще одну вьюшку, которая blur-ила все кроме всплывающей вьюшки. В итоге, осталось добавить Realm и сделать карусель бесконечной. Внизу можете увидеть почти готовый продукт, осталось добавить Realm и сделать карусель бесконечной. Уже есть два проекта: myPlaces и toDoList, код которых можно посмотреть у меня на github. Планирую начать следующее приложение, в котором будет список фильмов (работа с сетью) и можно будет создавать списки любимых фильмов или фильмов, которые вы бы хотели посмотреть.

Credits to me
Credits to me

Возвращаясь к началу, где я лежу в гамаке и никого не трогаю. Начинаю чувствовать запах дождя и вдруг слышу гром среди ясного неба. Открываю телеграм и вижу сообщение от HR, которая работает в одной хорошей компании - был приятно удивлен. Попросила скинуть резюме, которого на тот момент не было, и я начал делать его. Не хотел делать резюме от балды, поэтому потратил достаточное количество времени для его создания. После чего, отправил готовое резюме HR.

Мое резюме
Мое резюме

Ждать долго не пришлось - ответ пришел практически сразу и меня позвали на собеседование, которое должно пройти через неделю. Надеюсь, скоро вернусь с новостями. И тут я понял, что мое первое приглашение на собеседование был лишь громом и весь мой путь до этого момента был лишь затишьем перед бурей. Можно бурю отсидеть где-нибудь, а можно подготовиться, взять снаряжение и пойти навстречу. У меня после этого всего только один вопрос: Мам, где мое снаряжение?

-4