ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 13 で EventKitUI に追加された UIFont のカテゴリメソッド(多分Private用)

タイトルの通り iOS 13 で EventKitUI に UIFont のカテゴリメソッドが追加された。

@property(nonatomic, readonly, class) UIFont *ek_defaultOccurrenceSecondaryTextFont;
+ (UIFont *)ek_defaultOccurrencePrimaryTextFontForSizeClass:(UIUserInterfaceSizeClass)sizeClass;
+ (UIFont *)ek_defaultOccurrenceSmallPrimaryTextFontForSizeClass:(UIUserInterfaceSizeClass)sizeClass;

EventKit の prefix ek がついている。
Objective-C の場合、名前の衝突を防ぐためにカテゴリメソッドには prefix とアンダーバーを付けるのが通例。
この時点で既に Public API っぽくない匂いがしてくる。

公式ドキュメントは存在している

使ってみる

このカテゴリメソッド、Swift から直接は読み込めずに利用する事ができない。
その理由は上記のメソッドが EventKitUI/UIFont+EKDayOccurrenceView.h に定義されているにも関わらず framework のヘッダや modulemap でこのヘッダを読み込む様に指定されていないため。

/*
 *  EventKitUI.h
 *  EventKitUI
 *
 *  Copyright 2010 Apple Inc. All rights reserved.
 *
 */

#import <EventKit/EventKit.h>

#import <EventKitUI/EventKitUIDefines.h>
#import <EventKitUI/EKEventEditViewController.h>
#import <EventKitUI/EKEventViewController.h>
#import <EventKitUI/EKCalendarChooser.h>

Objective-C から利用するには以下の様に直接ファイルヘッダを指定して読み込む。
Swift から利用したい場合は <Module>-Bridging-Header.h で以下を指定する。

#import <EventKitUI/UIFont+EKDayOccurrenceView.h>
使った結果

ログ出力の実装

    NSLog(@"%@", UIFont.ek_defaultOccurrenceSecondaryTextFont);
    NSLog(@"%@", [UIFont ek_defaultOccurrencePrimaryTextFontForSizeClass:UIUserInterfaceSizeClassCompact]);
    NSLog(@"%@", [UIFont ek_defaultOccurrencePrimaryTextFontForSizeClass:UIUserInterfaceSizeClassRegular]);
    NSLog(@"%@", [UIFont ek_defaultOccurrencePrimaryTextFontForSizeClass:UIUserInterfaceSizeClassUnspecified]);
    NSLog(@"%@", [UIFont ek_defaultOccurrenceSmallPrimaryTextFontForSizeClass:UIUserInterfaceSizeClassCompact]);
    NSLog(@"%@", [UIFont ek_defaultOccurrenceSmallPrimaryTextFontForSizeClass:UIUserInterfaceSizeClassRegular]);
    NSLog(@"%@", [UIFont ek_defaultOccurrenceSmallPrimaryTextFontForSizeClass:UIUserInterfaceSizeClassUnspecified]);

ログの結果

    <UICTFont: 0x7f9d01403320> font-family: "UICTFontTextStyleCaption2"; font-weight: normal; font-style: normal; font-size: 11.00pt
    <UICTFont: 0x7f9d01404960> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 13.00pt
    <UICTFont: 0x7f9d01404960> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 13.00pt
    <UICTFont: 0x7f9d01404960> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 13.00pt
    <UICTFont: 0x7f9d01207540> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 11.00pt
    <UICTFont: 0x7f9d01404960> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 13.00pt
    <UICTFont: 0x7f9d01207540> font-family: ".SFUI-Semibold"; font-weight: bold; font-style: normal; font-size: 11.00pt

実際の見た目

f:id:Koze:20191015172736p:plain

メソッド名から察するに EventKitUI でのイベントの繰り返し設定周りで使われているフォントだと思われるけど、実際にUIのどこに使われているのかは分からなかった。
Private で使っているAPIのヘッダが Public ヘッダとして出されちゃってる感があるので小ネタというか参考程度に。Apple Feedback Assistant にレポートすれば多分将来いなくなると思う。*1 *2


ちなみに UIFont+EKDayOccurrenceView.h の5行目のファイルテンプレート部分に Created by でファイル作成者のアカウント名と日付が載っている。
通常の Apple 謹製 framework の Public Header にこの項目は載っていない事からも間違って Public に出てきている事が推測される。

This API seems to be private use. You can directly ...

追記

iOS 13.4 Beta 1 で deprecated に修正されました。

//
//  UIFont+EKDayOccurrenceView.h
//  EventKit
//
//  Copyright 2019 Apple Inc. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface UIFont (EKDayOccurrenceView)

@property (nonatomic, readonly, class) UIFont *ek_defaultOccurrenceSecondaryTextFont
API_DEPRECATED("No replacement. This is not intended for third party use and will return nil.", ios(13.0, 13.4))
API_UNAVAILABLE(macos, macCatalyst, watchos);

+ (UIFont *)ek_defaultOccurrencePrimaryTextFontForSizeClass:(UIUserInterfaceSizeClass)sizeClass
API_DEPRECATED("No replacement. This is not intended for third party use and will return nil.", ios(13.0, 13.4))
API_UNAVAILABLE(macos, macCatalyst, watchos);

+ (UIFont *)ek_defaultOccurrenceSmallPrimaryTextFontForSizeClass:(UIUserInterfaceSizeClass)sizeClass
API_DEPRECATED("No replacement. This is not intended for third party use and will return nil.", ios(13.0, 13.4))
API_UNAVAILABLE(macos, macCatalyst, watchos);

@end

NS_ASSUME_NONNULL_END

*1:レポートしておいた

*2:iOS 13.4 Beta 1 で deprecated に修正されました