These past two months I had the chance to collaborate with other 2 iOS Developers in creating this wonderful app, and in my opinion, if an app doesn't make the user's life easier or help in any way then it shouldn't be built for the simple fact that we developers are creators, we have the skills to bring any idea to reality; therefore, we have to take advantage of these skills for great things.

During this project, we encountered different situations in which waves of feelings were being exposed up to a certain point such as stress, frustration, self-criticism, emptiness, and more. Many developers can relate to these feelings because this is what we go through on a daily basis, I guess our job could never be boring at all!

People can overcome these feelings according to their own personalities, but when I go through this situation, I simply take a breather away from the computer and spend some time on different things in order to distract my mind. The big surprise is that when you go back to your computer and get to see your code once more everything seems to be clearer to both your eyes and mind.

These negative feelings are completely forgotten as soon as you press that Cmd+R command on your keyboard and you see your project building with no errors, it feels like you don’t need anything else because this just made your day entirely.

Working with Third-Party Libraries

Although it’s great to work with other people’s framework and your job becomes a lot easier, building your own code can be a lengthy task but at the end of the day you’re doing your future self a favor for so many reasons, but one of the reasons your code is breaking it's because your library is outdated and now you have to think about either bringing down your app and update those libraries or refactoring your code to prevent this issue from happening in the future.

This is why I can say in a very humble way that I don’t care how ugly my code is as long as I made it work the way I wanted because I can always refactor it later on in my building process. I’d like to show you a very simple way to animate letters on a UILabel without having to install a framework for this:

override func viewDidLoad() {
   super.viewDidLoad()
   //Letter animation
   appNameLabel.text = ""
   var charIndex = 0.0
   let titleText = "CitySpire"

   for letter in titleText {
       print("-")
       print(0.1 * charIndex)
       print(letter)

       Timer.scheduledTimer(withTimeInterval: 0.15 * charIndex, repeats: false) { (timer) in
           self.appNameLabel.text?.append(letter)
       }
       charIndex += 1
     }
 }

Keeping App's Lifecycle in Mind

We sometimes try to improve our designing skills by customizing many UI parts on the application without sometimes keeping in mind the App's Lifecycle which can sometimes make us go through a debugging journey for making this mistake, it’s like your app screaming “You don’t deserve a running App for making this silly mistake!!!”. Which can be true at times, but hey! We’re developers, we fix stuff!.

When customizing a UI, we have to make sure we know when this customization will take effect once the app goes into the foreground, and I could name a very simple case in which just placing your code inside your beloved and acclaimed viewDidLoad simply won't work properly and sometimes won't even load your changes at all, and here's a tip for this:

You can just create a method that will handle all your custom changes and then (this is the nice part) call that function inside the viewDidLayoutSubviews() asynchronously. Hold on, but why? Well, this customization will be visible because we're using a built-in method that loads after viewDidLoad making these changes on the UI visible when the app finishes loading. See code below:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    DispatchQueue.main.async {
        self.imageViewUpdate()
   }
}

func imageViewUpdate() {
    guard let myProfileView = profileImageOutlet else { return }
    myProfileView.layer.borderWidth = 1.0
    myProfileView.layer.masksToBounds = false
    myProfileView.layer.borderColor = UIColor.gray.cgColor
    myProfileView.layer.cornerRadius = profileImageOutlet.frame.size.width / 2
    myProfileView.clipsToBounds = true
}

Finishing Strong as a Team!

Finally, after 2 months of working on the app's documentation, and other different tasks, we were able to see a working product that other team of talented developers could scale and make even more useful for users allowing them to make more educated decisions when moving to a different location where walkability, cost of living and crime rate are very important pieces of data that would completely make a difference when making this life change.  I have to mention the immense amount of knowledge I was able to acquire from the cross-functional team and the other two developers I worked with. This was a life-changing experience allowing me to find new long-term friendships in the process at the same time knowing that we count on each other's support whenever needed.

Personal Growth

I have learned so much in this project from implementing new things to gathering knowledge from each of the team members that I feel I became a better developer than I was before, and this knowledge will be passed on to other developers in the near future whenever my help is needed. Now it's time for me to go out there and help other people, other companies and also dedicate more time to my personal projects to keep my skills expanding because we as developers will never stop being students. Learning and adjusting to new technologies is one of our main tasks if we want to continue being relevant and knowledgeable. What a great journey this has been, thank you, Team!!!