Archive for July 28, 2016

Thursday, July 28, 2016

Apple User Interface Trends

Nick Babich:

For every action, there is a reaction. And in the world of digital design, flat design was a reaction against skeumorphism. Since anything on a screen will never truly look three dimensional, why not to stripping away illusory decoration and focus on functionality instead?

[…]

Recently, designers have begun to realize the usability issues of flat design and as a result, a more balanced interpretation of flat design has emerged. New solution sometimes referred to as ‘almost flat’ or ‘flat 2.0’ design. This design style is mostly flat, but makes use of subtle shadows, highlights, and layers to create some depth in the UI.

Nicholas W. Howard (via Rich Siegel and Gus Mueller):

In Apple’s view, an icon depicting a camera and a photo was too literal for an application that handles photos. Therefore, when iPhoto gave way to its replacement in 2015—Photos—the previous carefully-rendered icon gave way to this bland, meaningless rainbow abstraction.

[…]

Contrary to the ideas they express on this archival Mac Basics page (which, it must be observed, still features old icons), Apple nowadays prefers abstraction to metaphor, the less literal to the more literal, the two-dimensional glyph to the three-dimensional illustration. Allow me to explain how this ideological shift occurred in full-step with the design community at large.

[…]

Apple has gradually drained the color from the Finder sidebar, removing helpful visual distinctions from a part of OS X that millions of people interact with every day.

Nicholas W. Howard:

Now turn your attention to the barber pole’s successor, on the right. This redesigned loading signal, introduced in OS X Yosemite, reduces visibility in several significant ways: it measures less than half the height of its predecessor, uses only blue rather than blue-and-white, and makes its animated element—a slight glowing patch that moves across it—so bafflingly faint that even someone with superb vision can barely see it. The animation is the part that conveys “loading”: if Apple fails to make the “loading” state obvious, how will anyone ever know the loading is happening at all?

[…]

Clicking this “New Folder” button (if one can accurately call it a button), found in the Notes app, yields insignificant feedback: it almost feels as if nothing happens.

[…]

Hovering over Safari’s address bar no longer turns the cursor from the regular pointer to the “I-beam” text cursor; of course, one can still click on the address bar and type, but the cursor swap that whispered, “This is a place for typing,” is gone. In my testing, various search fields throughout the system sometimes replicated this problem, and sometimes not. OS X once handled this behavior properly and consistently. It no longer does.

[…]

It is a pity you did not know the “Detect Displays” button still exists. The button is invisible. You need only… hold down the Option key to summon it.

[…]

Some of these buttons in Pages have an arrow to indicate a dropdown menu. Others have no arrow but spawn a dropdown menu anyway. Apple has presented us with a guessing game.

John Gruber:

Luke Wroblewski posted an interesting side-by-side comparison of the Today view, Control Center, and standard sharing sheets in iOS 7 and the iOS 10 public beta. Much less transparency, more solid shapes in place of outlines, and more use of color.

End of Source-breaking Changes for Swift 3

Ted Kremenek:

The Swift team at Apple has reflected on this and decided what it “means” for Swift 3 to be source compatible with Swift 4 and later releases going forward. Our goal is to allow app developers to combine a mix of Swift modules (e.g., SwiftPM packages), where each module is known to compile with a specific version of the language (module A works with Swift 3, module B works with Swift 3.1, etc.), then combine those modules into a single binary. The key feature is that a module can be migrated from Swift 3 to 3.1 to 4 (and beyond) independently of its dependencies.

While the exact details of how we will accomplish this feat are still being discussed, here is a sketch of how this will likely work in the Swift 4 timeframe. The key enabler is a new compiler flag that indicates the language version to compile for (e.g., similar to the clang -std=c99 flag). The compiler flag will be provided by the build system you are using (e.g., Xcode, SwiftPM, etc.) on a per-module basis[…]

[…]

The great thing about this approach is that a single Swift 4 compiler is building all of the sources in an application. This allows us to roll out this approach before achieving full ABI stability — something that will be a goal for Swift 4, but is impractical to achieve for a Swift 3.x release. It also provides us a general framework in the future for handling source compatibility as Swift evolves.

See also: Swift Programming Language Evolution: Proposal Status (via Jacob Bandes-Storch).

Witch, Spaces, and Private API

Rob Griffiths:

Since that rejection, we’ve been looking for a solution to providing Spaces support for App Store Witch users … and unfortunately, we couldn’t find one: The only way we can get the window information we need from other Spaces is to use the private API. And that means that only the direct version of Witch supports Spaces, because we can use the private API. But App Store Witch no longer supports Spaces.

GRDB Swift SQLite ORM

Gwendal Roué:

GRDB.swift is a Swift application toolkit that provides access to SQLite databases.

[…]

GRDB is protocol-oriented, and fetching methods are proper to the RowConvertible protocol.

[…]

This makes GRDB quite unlike other Swift ORMs that use class inheritance and make heavy use of objects mutability, like Realm and Core Data. Both of them provide uniquing and auto-updating records.

Update (2017-05-03): Gwendal Roué:

SQLite provides Data Change Notification Callbacks, and Compile-Time Authorization Callbacks. The first notify of modified rows, when the latter tell which tables and columns are involved in an SQL statement.

When you combine them, you are able to tell if an SQL statement has the opportunity to affect the results of another query. This is the recipe for database observation through RxGRDB (a reactive extension for GRDB over RxSwift), or FetchedRecordsController (a Swift version of Core Data’s NSFetchedResultsController).