API 是開發者的使用者介面 (DX)。優秀 API 應具備:直觀性、容錯性、易用性。設計原則同 UI/UX:預設值滿足 70% 場景、預設即可用、漸進式揭露複雜度。
@property (readonly) id delegate; 暴露只讀。// default: 72 pixels#define MG_PAGE_SWITCHING_TILE_INDEX -1
// 初始化 (必要參數)
- (id)initWithDelegate:(id)delegate;
// 客製化屬性 (10+ 屬性 vs 4 方法)
@property (nonatomic) BOOL dismissAfterTileActivated; // default YES
@property (nonatomic) BOOL rightHanded; // default YES
@property (nonatomic) NSInteger tileSide; // default 72
@property (nonatomic) NSInteger tileGap; // default 20
@property (nonatomic) CGFloat cornerRadius; // default 8
// 委派協議 (合併資料來源)
@protocol MGTileMenuDelegate
@required
- (NSInteger)numberOfTilesInMenu:(MGTileMenuController*)menu;
- (UIImage*)imageForTile:(NSInteger)tile inMenu:(MGTileMenuController*)menu;
- (NSString*)labelForTile:(NSInteger)tile inMenu:(MGTileMenuController*)menu;
- (NSString*)descriptionForTile:(NSInteger)tile inMenu:(MGTileMenuController*)menu;
- (void)tileMenu:(MGTileMenuController*)menu didActivateTile:(NSInteger)tile;
@optional
- (void)tileMenu:(MGTileMenuController*)menu didSelectTile:(NSInteger)tile;
- (void)tileMenu:(MGTileMenuController*)menu didDeselectTile:(NSInteger)tile;
- (BOOL)isTileEnabled:(NSInteger)tile inMenu:(MGTileMenuController*)menu;
@end
// 通知
extern NSString *MGTileMenuWillDisplayNotification;
extern NSString *MGTileMenuDidDisplayNotification;
// userInfo: @{ MGPageNumberKey : @(pageNumber) }
遵循此 25 條規則,可產出設計良好、靈活、可重用、令人愉悅的 Objective-C 元件。核心在於:以使用者 (開發者) 為中心,預設即可用、漸進揭露、語意清晰、測試徹底。