— А остальные пункты вашего резюме так же близки к истине, как и этот?
— В них столько правды, сколько вам угодно. Если резюме вас устраивает, оно правдиво. В противном случае я его перепишу.
Тишина. Вдалеке чуть слышно, как поют птички. Странно, что даже ветра нет. Погода в моем абстрактном мире просто великолепна. Я, у себя в голове, лежу в гамаке и немножко качаюсь из стороны в сторону. Прошло 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. Планирую начать следующее приложение, в котором будет список фильмов (работа с сетью) и можно будет создавать списки любимых фильмов или фильмов, которые вы бы хотели посмотреть.
Возвращаясь к началу, где я лежу в гамаке и никого не трогаю. Начинаю чувствовать запах дождя и вдруг слышу гром среди ясного неба. Открываю телеграм и вижу сообщение от HR, которая работает в одной хорошей компании - был приятно удивлен. Попросила скинуть резюме, которого на тот момент не было, и я начал делать его. Не хотел делать резюме от балды, поэтому потратил достаточное количество времени для его создания. После чего, отправил готовое резюме HR.
Ждать долго не пришлось - ответ пришел практически сразу и меня позвали на собеседование, которое должно пройти через неделю. Надеюсь, скоро вернусь с новостями. И тут я понял, что мое первое приглашение на собеседование был лишь громом и весь мой путь до этого момента был лишь затишьем перед бурей. Можно бурю отсидеть где-нибудь, а можно подготовиться, взять снаряжение и пойти навстречу. У меня после этого всего только один вопрос: Мам, где мое снаряжение?