<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Blog on Marcel Voss</title>
    <link>https://marcelvoss.com/blog/</link>
    <description>Recent content in Blog on Marcel Voss</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>Copyright © 2015–2025 Marcel Voss</copyright>
    <lastBuildDate>Sun, 30 Nov 2025 12:26:05 +0100</lastBuildDate>
    <atom:link href="https://marcelvoss.com/blog/rss.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Introducing Semantics into Navigation Bars</title>
      <link>https://marcelvoss.com/2025/introducing-semantics-into-navigation-bars/</link>
      <pubDate>Sun, 30 Nov 2025 12:26:05 +0100</pubDate>
      <guid>https://marcelvoss.com/2025/introducing-semantics-into-navigation-bars/</guid>
      <description>&lt;p&gt;A while back, I wrote about the frustrating state of navigation bars on iOS and how that frustration grew once we started reviewing and rebuilding our own navigation bars at work.&lt;/p&gt;&#xA;&lt;p&gt;We’ve since managed to achieve what we set out to do and recently shipped the result to our users. Along the way, we took the opportunity to finally tackle a problem we’d been struggling with for years: consistency.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Frustrating State of Navigation Bars on iOS</title>
      <link>https://marcelvoss.com/2025/the-frustrating-state-of-navigation-bars-on-ios/</link>
      <pubDate>Mon, 10 Feb 2025 10:26:05 +0100</pubDate>
      <guid>https://marcelvoss.com/2025/the-frustrating-state-of-navigation-bars-on-ios/</guid>
      <description>&lt;p&gt;It’s been 18 years since iOS launched and 17 years since the iOS SDK was released—yet the navigation bar is still frustratingly uncustomizable. Sure, you can tweak text attributes, background images, and colors, but anything beyond that? Forget it. Even Apple’s own Invites app highlights how limited it is.&lt;/p&gt;&#xA;&lt;p&gt;Take back buttons, for example. UIKit technically allows you to set an image or a custom title, but try adding a fully custom view (say, one that matches your company’s design) using &lt;code&gt;UIBarButtonItem(customView:)&lt;/code&gt;, and you’ll quickly realize it doesn’t work. Quoting the &lt;a href=&#34;https://developer.apple.com/documentation/uikit/uinavigationitem/backbarbuttonitem&#34;&gt;documentation&lt;/a&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tricking Xcode into Running on an ‘Unsupported’ macOS</title>
      <link>https://marcelvoss.com/2025/tricking-xcode-into-running-on-an-unsupported-macos/</link>
      <pubDate>Wed, 05 Feb 2025 21:01:06 +0100</pubDate>
      <guid>https://marcelvoss.com/2025/tricking-xcode-into-running-on-an-unsupported-macos/</guid>
      <description>&lt;p&gt;Every year, with each major macOS update, we’re greeted by an annoying surprise—Xcode refuses to launch, insisting that we upgrade to a newer version. But sometimes, upgrading isn’t an option.&lt;/p&gt;&#xA;&lt;p&gt;Maybe your team’s app isn’t ready yet due to build system issues, breaking API changes, or other compatibility problems. In my case, it usually takes a couple of months before our project is fully prepared for the latest Xcode release. While holding off on upgrading macOS is an option, sometimes the new macOS version has features that make the upgrade too tempting to resist. But if it’s your work machine, the priority is clear: you need to be able to do your job.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rethinking Our Color System: A Type-Safe Approach in Swift</title>
      <link>https://marcelvoss.com/2025/rethinking-our-color-system-a-type-safe-approach-in-swift/</link>
      <pubDate>Sun, 02 Feb 2025 18:00:05 +0100</pubDate>
      <guid>https://marcelvoss.com/2025/rethinking-our-color-system-a-type-safe-approach-in-swift/</guid>
      <description>&lt;p&gt;Our design system&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; provides colors for three different contexts: background, foreground, and borders. Each color can exist in four different states: normal, hovered, disabled, and pressed. Historically, we modeled this using a &lt;code&gt;UIColor&lt;/code&gt; subclass that exposed properties for different states. When the instance was used as is, it implicitly represented the normal variant.&lt;/p&gt;&#xA;&lt;p&gt;While this approach was convenient—since developers never had to manually reference the normal state—it had trade-offs. As customization expanded and dark mode support became essential, we ran into a major issue: our subclass didn’t work with UIColor’s dynamic theming mechanism. It turns out, subclassing UIColor is possible but not recommended&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m Using Linux in My Spare Time Now</title>
      <link>https://marcelvoss.com/2024/im-using-linux-in-my-spare-time-now/</link>
      <pubDate>Wed, 02 Oct 2024 17:35:51 +0200</pubDate>
      <guid>https://marcelvoss.com/2024/im-using-linux-in-my-spare-time-now/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve always been a console gamer, avoiding gaming PCs because I didn&amp;rsquo;t want to deal with tweaking graphical settings or, more importantly, Windows. However, when I got into sim racing during the COVID lockdowns, I had no choice but to build a proper gaming PC. The drivers for my sim racing hardware were only supported on PC, and the selection of racing games was significantly better.&lt;/p&gt;&#xA;&lt;p&gt;Unsurprisingly, returning to Windows was as frustrating as I remembered. Almost immediately, I was reminded of why I&amp;rsquo;d avoided it for so long. Microsoft may have made some cosmetic UI updates, but beneath the surface, it&amp;rsquo;s still the same bloated, flawed system. They&amp;rsquo;ve added new &amp;ldquo;features&amp;rdquo; like AI integrations, but relics like Aero-themed apps still linger. The new Settings app looks fine and has adopted Microsoft&amp;rsquo;s &amp;ldquo;Fluent Design Language&amp;rdquo;, but Microsoft being Microsoft, kept the outdated Control Panel from the Vista era, which opens up for advanced settings that the new app doesn&amp;rsquo;t cover yet. The UI simply isn&amp;rsquo;t consistent and feels like a zoo. Ads in the start menu and being forced to use a Microsoft account felt like too much. This inconsistency is something I&amp;rsquo;m not used to with Apple. Apple tends to cut ties with old software quickly, and macOS feels far more cohesive and polished by comparison.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Tip: Safely using UIImage</title>
      <link>https://marcelvoss.com/2023/quick-tip-safely-using-uiimage/</link>
      <pubDate>Fri, 02 Jun 2023 00:00:00 +0000</pubDate>
      <guid>https://marcelvoss.com/2023/quick-tip-safely-using-uiimage/</guid>
      <description>&lt;p&gt;I don&amp;rsquo;t know about you, but it happens quite often to me that I want to use a &lt;code&gt;UIImage&lt;/code&gt; instance and assign it to another piece of UI that requires it to be non-optional. Unfortunately, most UIImage initializers produce optionals. While this does make sense, as the asset might be missing or there has been a typo in its name, it can be quite annoying when we&amp;rsquo;re sure the asset exists and can be used. But don&amp;rsquo;t worry, there&amp;rsquo;s an easy trick to work around behavior.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Enabling Upcoming Swift Language Features</title>
      <link>https://marcelvoss.com/2023/enabling-upcoming-swift-language-features/</link>
      <pubDate>Wed, 22 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://marcelvoss.com/2023/enabling-upcoming-swift-language-features/</guid>
      <description>&lt;p&gt;Swift 6 has a bunch of changes that will change the way we will use Swift in the future, with some of them being breaking changes. Wouldn&amp;rsquo;t it be handy if we could try out some of these upcoming features ahead of their release, so we can evaluate the impact they will have on our codebase and can start amending our code already? Good news: there is!&lt;/p&gt;&#xA;&lt;p&gt;With &lt;a href=&#34;https://github.com/apple/swift-evolution/blob/main/proposals/0362-piecemeal-future-features.md&#34;&gt;SE-0362&lt;/a&gt; having been implemented in Swift 5.8, we can now opt-in into certain Swift features ahead of their release, given they&amp;rsquo;ve been already implemented in the used toolchain version, in a similar fashion as we previouly could with &lt;code&gt;SWIFT_STRICT_CONCURRENCY&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I switched from Publish to Hugo</title>
      <link>https://marcelvoss.com/2023/i-switched-from-publish-to-hugo/</link>
      <pubDate>Fri, 17 Mar 2023 15:00:00 +0100</pubDate>
      <guid>https://marcelvoss.com/2023/i-switched-from-publish-to-hugo/</guid>
      <description>&lt;p&gt;After almost three years without any post on this blog, I finally managed to post something and not only did I post a new article, I also transitioned this site from being built using John Sundell&amp;rsquo;s Swift-based &lt;a href=&#34;https://github.com/JohnSundell/Publish&#34;&gt;Publish&lt;/a&gt; static site generator to the Go-based &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; generator. 🎉&lt;/p&gt;&#xA;&lt;p&gt;While I like Hugo and its maturity, I&amp;rsquo;m still torn as I enjoyed the way Publish used Swift for building the theme, defining the generation pipeline, as well as its integration of plugins for extending it. However, its development seems to have ceased and due to it lacking certain features compared to more mature generators (such as automatically reloading content when developing locally), it didn&amp;rsquo;t make sense to continue investing more time into trying to make it work for what I want. Although I&amp;rsquo;m happy I finally found the motivation for doing the transition, it was a main frustration point whenever I wanted to post something on here before.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick Tip: Kotlin Scope Functions in Swift</title>
      <link>https://marcelvoss.com/2020/quick-tip-kotlin-scope-functions-in-swift/</link>
      <pubDate>Fri, 05 Jun 2020 19:45:05 +0100</pubDate>
      <guid>https://marcelvoss.com/2020/quick-tip-kotlin-scope-functions-in-swift/</guid>
      <description>&lt;p&gt;When I recently reviewed a colleagues’ Android code, I stumbled upon a function call named &lt;code&gt;with&lt;/code&gt; that allows for omitting a variable’s name within its scope (for example for accessing multiple members). As pointed out by that colleague,  Kotlin actually has a bunch of nifty APIs that are being described as &lt;a href=&#34;https://kotlinlang.org/docs/reference/scope-functions.html&#34;&gt;Scope Functions&lt;/a&gt; .&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;The Kotlin standard library contains several functions whose sole purpose is to execute a block of code within the context of an object. […] In this scope, you can access the object without its name. Such functions are called &lt;em&gt;scope functions&lt;/em&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Higher Order Functions in Objective-C</title>
      <link>https://marcelvoss.com/2019/higher-order-functions-in-objective-c/</link>
      <pubDate>Thu, 26 Dec 2019 22:35:51 +0100</pubDate>
      <guid>https://marcelvoss.com/2019/higher-order-functions-in-objective-c/</guid>
      <description>&lt;p&gt;What do all higher order functions in Swift have in common? They abstract boilerplate code away by hiding it in their highly generic implementations, focussing on what to achieve rather than on &lt;em&gt;how to get there&lt;/em&gt; because that&amp;rsquo;s what we usually care about. By abstracting boilerplate away, we can eliminate plenty of failures we could potentially introduce by writing the same thing over and over again, not realizing a small mistake.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hello, world</title>
      <link>https://marcelvoss.com/2019/hello-world/</link>
      <pubDate>Wed, 17 Apr 2019 13:35:34 +0100</pubDate>
      <guid>https://marcelvoss.com/2019/hello-world/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;A &amp;ldquo;Hello, World!&amp;rdquo; program generally is a computer program that outputs or displays the message &amp;ldquo;Hello, World!&amp;rdquo;. Because it is very simple in most programming languages, it is often used to illustrate the basic syntax of a programming language and is often the first program that those learning to code write. - &lt;a href=&#34;https://en.wikipedia.org/wiki/%22Hello,_World!%22_program&#34;&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;As the title of this post suggests, this blog will be (mainly) about software development. In the future, I would also like to write about interesting topics I come across (not necessarily related to software engineering) or simply my opinion on certain things - very much what you would expect from a typical blog (apart from the food and fashion content that is popoular nowadays). I already have some ideas for a couple of topics that might be interesting enough to write a post on them. Although I used to blog in the past, I&amp;rsquo;m not too experienced in blogging (mostly because I stopped writing at some point and don&amp;rsquo;t feel confident enough on the content I write), so let&amp;rsquo;s see how this plays out - exciting!&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
