:  ~ 7 min read

CAAnimations and groups

Everyone loves animations and I think every app should make use of them; with care, but that in a future post. The easiest way to add animations is with UIView’s animate method, or with UIViewPropertyAnimators. Pretty straightforward and easy to use, but they don’t support animating CALayer properties, like borderColor or borderWidth. For these, we have CABasicAnimation, or rather all of its concrete subclasses: CABasicAnimation, CAKeyframeAnimation, CAAnimationGroup, or CATransition. In this post we’ll quickly cover CABasicAnimation and CAAnimationGroup.

Say we want to animate the borderColor […]

Continue reading →

:  ~ 1 min read

Easier UIFont usage

In a previous post I was writing about improving working with UIFont and now I’d like to take it one step further in regards with having a quick and easy way to set fonts, if you use a single typeface (font family):

extension UIFont {

   static func regular(_ size: CGFloat) -> UIFont {
      return .systemFont(ofSize: size, weight: .regular) // Or any other font.
   }
	
   static func medium(_ size: CGFloat) -> UIFont {
      return .systemFont(ofSize: size, weight: .medium)
   }

}

This might not seem much, or maybe I’m just lazy, but I find it easier to write and read

let nameLabel = UILabel […]
Continue reading →

:  ~ 1 min read

My Travel Stories

The other week we released My Travel Stories, an app to journal your travels, share beautiful photos with the world, but also find inspiration from others.

There are many apps you could use to journal your travels, be it diary apps, or the stock Photos app; but none of them are a true, focused, travelling journal app. My Travel Stories is a dedicated app, where you can add photos and descriptions for each; nothing more, nothing less.

There are also many review sites and many platforms to share you photos/opinions on, but none of them has true human-to-human interactions. At least that’s how I […]

Continue reading →

:  ~ 12 min read

Avoiding the keyboard on UITextField focus

A couple of posts ago I was writing about handling the Next button automatically. In this post I’d like to write about avoiding the keyboard automatically, in a manner that provides both a good user experience and a good developer experience.

Most apps have some sort of form that requires to be filled, even if just a login/register, if not several. As a user, having the keyboard cover the text field I'm about to fill makes me sad; it's a poor user experience. As developers, we'd like to solve this as easily as possible and have the solution as reusable as possible.

What does a good user experi […]

Continue reading →

:  ~ 2 min read

Optionals, flatMap and you

Say we have a UILabel where we want to display a birthdate with a full format, and an API from where we get a String? with iso8601 format. One of the ways to do this would be:

let dateFromAPI: String?

// [...]

let dateFormatter = DateFormatter.shared // 1
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"

if let dateString = dateFromAPI, // 2
   let date = dateFormatter.date(from: dateString) { // 3
   dateFormatter.dateFormat = nil
   dateFormatter.dateStyle = .full

   dateLabel.text = dateFormatter.string(from: date) // 4
}

DateFormatters are expensive to create, so we either cre […]

Continue reading →

:  ~ 1 min read

Goalee

Yesterday we released Goalee, an app that helps you not lose sight of your life’s goals. The main idea behind the app is that all the annoyances, conflicts or so-called problems we face in our everyday lives pale in comparison with our true goals in life.

The issue I faced, as many others, is that I tend to lose track of what I desire most, exactly because of problems here and there. One approach is to start writing down your goals on a sheet of paper, which I did and it worked; for a while, because I eventually started overlooking said sheet of paper.

I then tried using to-do apps, or habit t […]

Continue reading →

:  ~ 15 min read

Handling the Next button automatically

Entering text in multiple text fields is such a common pattern — everywhere, not just iOS — there should be a way to easily navigate from on field to the next, preferably the ”correct” one. Sadly, iOS doesn’t offer this feature, but let’s see how we could accomplish this ourselves.

First, a quick recap on what we need:

Continue reading →

:  ~ 4 min read

Increasing the tap area of a UIButton

The other day, Soroush wrote a great post about hitTest(_:with:) (you should check it out), which reminded me of a problem I solved the other week: I wanted to increase a UIButton’s tap area, without increasing the button’s frame.

The following code would go in one of the button’s superviews; for example, you might have a mainContainer, which has a UIStackView that contains the button — we’d implement it in mainContainer:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
   let biggerButtonFrame = theButton.frame.insetBy(dx: -30, dy: -30) // 1

   if biggerButtonFrame.c […]
Continue reading →

:  ~ 8 min read

Extracting the location from a photo

I’d like to quickly explain how to let the user pick a photo and automatically extract the location for them. The post is targeted at iOS 11+, because starting with this version, to use an UIImagePickerController we don’t need to ask the user’s permission to access their photo library, because the controller runs as a separate process from the app, which means the app gets read-only access only to the image the user selected, and just to the image — no metadata included.

For this, we will need the UIImagePickerController:

func pickPhotoFromLibrary() {
   // 1
   guard UIImagePickerController.i […]
Continue reading →

:  ~ 16 min read

Extracting and parsing tweets from your Twitter archive

I’ve recently gave Micro.blog a try and  shortly after  I thought of importing all my tweets here, because … why not own my content? This post will be about extracting and converting your Twitter archive into simpler objects with just text and timestamp — there are many more available fields, but these were the only ones I was particularly interested in.

First things first, we need to request your archive: in our Twitter’s profile settings, all the way to the bottom we can find ”Your Tweet archive”; we need to click on ”Request your archive” and after a while we’ll receive an email with a link […]

Continue reading →