After three years since selling PSPDFKit to Insight Partners, I'm embarking on a new chapter in my career. This post reflects on my decade-long journey building a global document solutions company from the ground up, and announces my transition from iOS and native development to web technologies. I share my motivations for this significant career shift—seeking growth through new challenges, embracing the maturity of modern web platforms, and rediscovering the joy of building from scratch. While not yet revealing specifics about my new venture, I explain how I'm approaching this transition with the same principles that guided my previous work: meticulous attention to detail, user-centered design, and creating software that's both powerful and delightful to use.
This article tackles a specific limitation in SwiftUI's menu system on macOS—conditionally showing top-level menus like a Debug menu. While SwiftUI elegantly handles conditional menu items within a CommandMenu, it doesn't provide a native way to show or hide entire top-level menus. I explore the problem, demonstrate why standard SwiftUI approaches fail due to CommandsBuilder limitations, and provide a practical workaround using AppKit integration. The solution leverages NSApp.mainMenu directly, showing how to bridge SwiftUI's declarative paradigm with imperative AppKit code when needed.
This article investigates and resolves a specific bug with iOS 14's keyboardShortcut functionality in SwiftUI. Through careful debugging and reverse engineering, I identify why keyboard shortcuts work in SwiftUI app lifecycle but fail when integrating SwiftUI into UIKit apps. The investigation traces the issue to a missing internal state change in UIHostingController and provides a simple workaround that triggers the correct behavior. The post includes detailed debugging steps using LLDB and Hopper, explaining the internals of SwiftUI's keyboard shortcut handling mechanism.
This article explores the challenges of implementing both tap and long-press functionality on a SwiftUI button. After testing several SwiftUI-native approaches that fail, particularly on Mac Catalyst, I demonstrate a robust solution using UIKit integration. The post walks through four different implementation attempts, explaining why each succeeds or fails, and culminates in a reusable LongPressButton component that works consistently across iOS, iPadOS, and Mac Catalyst. This practical guide highlights the current limitations of SwiftUI gestures and shows how to effectively bridge UIKit functionality when needed.
This article documents my experience integrating Apple Silicon M1 Mac minis into our continuous integration system. It explores the promised performance benefits and actual benchmarks while detailing numerous technical challenges encountered during setup. I cover working around Rosetta 2 limitations, detecting Apple Silicon in scripts, handling APFS container differences, and addressing various Xcode, memory, and test issues specific to the M1. The article provides practical solutions and code snippets for teams transitioning CI infrastructure to Apple Silicon, along with performance comparisons showing where the M1 excels and where Intel Macs still have advantages, especially for older iOS simulator versions.
I put the new M1 MacBook Air through its paces as a serious development machine. From benchmarking Xcode build times to testing various developer tools, I explore how well Apple's transition to custom silicon works for real-world development workflows. While most apps run brilliantly via Rosetta 2 and native performance is stunning, I uncover both surprising benefits and important limitations developers should understand before making the switch. This early assessment reveals why M1 Macs represent a fundamental shift in the developer experience.
Transform your Twitter experience by thoughtfully curating your timeline. I share practical strategies for managing who you follow, how to use Twitter's powerful muting features for both accounts and keywords, and when to consider blocking. Learn why I recommend avoiding hashtags, how to disable retweets selectively, and the advantages of using Twitter's official client over third-party apps. This guide provides actionable advice for creating a Twitter feed that's informative and enjoyable rather than overwhelming, helping you focus on content that matters to you while filtering out noise and negativity.
This article shares strategies for growing a Twitter following based on 12 years of experience. It covers developing an authentic online persona, maintaining a consistent avatar, engaging with your audience, and extending your reach through blog posts and conference talks. The post offers practical advice on tweet composition, using threads effectively, and tracking follower growth—all aimed at building a meaningful Twitter presence over time.
Discover the undocumented limitations in macOS Big Sur's new 'Optimize Interface for Mac' mode for Catalyst apps. I investigate why certain UIKit controls like UIStepper and UISlider throw runtime exceptions when used with the Mac idiom, and explore what happens behind the scenes as UIKit maps these controls to AppKit equivalents. Through runtime inspection and disassembly, I identify which controls are forbidden, how customization attempts are blocked, and provide workarounds for detecting the Mac idiom in your code. This technical deep-dive includes findings from examining the shared dyld cache and reveals how Apple bridges UIKit and AppKit in the new unscaled Catalyst mode.
Fix an annoying iOS 14 behavior where UIHostingController automatically avoids the keyboard - even when it shouldn't. This tutorial shows how to identify and disable unwanted keyboard avoidance in SwiftUI by examining the UIHostingView class and using runtime tricks to modify its behavior. I demonstrate how to apply dynamic subclassing to override the keyboard notification handling methods, providing a clean solution that works for embedded SwiftUI views in table and collection cells. Learn how to implement this fix both with my InterposeKit library and using pure Objective-C runtime functions for a safer approach than traditional method swizzling.