What’s new in SepiaScape and SeasonScape 3.1?

SepiaScape screenshot showing map and picture list side-by-side on an iPhone 6 screen.

Going to the ⓘ screen no longer crashes on iOS 8 or later. It also makes better use of the larger screens on the iPhone 6 and iPhone 6 Plus.

(If you are wondering what they are, here is the page about SepiaScape. SeasonScape no longer exists as a separate app; all its text and pictures are now part of SepiaScape.)

How did the crash happen, anyway?

SepiaScape, like many apps, uses UITableView for several parts of its user interface.  As is also common, these tables have their row height set to the default.  In iOS versions up to 7, this height is 44 pixels.  However, in iOS 8, the default height is a constant called UITableViewAutomaticDimension – which has the numeric value of -1.  In fact, if the height of 44 pixels is typed into the user interface editor at design time, this becomes -1 at runtime.

For most apps, this was a good change: cells which used to be fixed size now adjust to fit their content.

In SepiaScape, the table displayed on the ⓘ screen contains some stretched cells:

Table with variable height cells, annotated to show that some cells are 44 pixels high and others are 58 pixels high.
Some – but not all – of the “Tracking” cells in the “Settings” table are made taller to reduce clutter.

The height of the stretched cells was calculated using the table’s existing rowHeight property, multiplied by 4/3 and rounded down.  This worked fine when rowHeight was 44.  However, in iOS 8 rowHeight returned UITableViewAutomaticDimension (-1), this calculation turned it into -2, and this value was sent to the table as an appropriate row height.

UITableView didn’t think that -2 was an appropriate row height, and threw an NSInternalInconsistencyException, reason “Invalid row height provided by table delegate. Value must be greater than zero or UITableViewAutomaticDimension.”

SepiaScape wasn’t the only app affected; see for example the StackOverflow question Wrong value from UITableView:rowHeight at iOS8.

To activate location tracking on iOS 8, SepiaScape also needed to call CLLocationManager requestWhenInUseAuthorization, which it now does.  The absence of this call was hardly an issue when the switch for location tracking was on the ⓘ screen and therefore inaccessible.

What difference do the iPhone 6 screens make?

They make quite a bit of difference.

Screenshot of the SepiaScape app with text filling a tiny screen.
iPhone 4 (960×640, 2× resolution)
Screenshot of the SepiaScape app with text filling a small screen.
iPhone 5 and 5s (1136×640, 2× resolution)
Screenshot of the SepiaScape app with text taking up some space on a moderate screen.
iPhone 6 (1334×750, 2× resolution)
Screenshot of the SepiaScape app with text taking up half of a large screen.
iPhone 6 Plus (stored as 2208×1242, 3× resolution, displayed at 1920×1080)

Leave a Reply

Your e-mail address will not be published or shared with third parties.

First comments from new name/e-mail combinations will be held in moderation.