2çªç®ã®ã¹ãããã¯ãã¯ã©ã¹èªäœã®ãã¡ã€ã«ãé©åã«ç·šæããããšã§ãã
äžéšã®äººã«ãšã£ãŠãObj Cã«é¢ããèšäºã¯å€é¢šãªããã«èŠãããããããŸãããããããŸã§ã®ãšãããSwiftãžã®éåšçãªç§»è¡ãèšç»ããŠããŸããã ããã¯ãæ°ãããããžã§ã¯ãã§ã®ã¹ã ãŒãºãªä»£æ¿ã§ãã ç¶æããå¿ èŠããã倧ããªObjective-Cã³ãŒãããŒã¹ããŸã ãããŸãã
ãŸããSwiftã¯å€§èŠæš¡ãããžã§ã¯ãã§ååãªçµéšãç©ãã§ããŸããã
åäŸãšããŠã WYPopoverControllerãæ€èšããããšããå§ãããŸãã
圌ãçããã§ã¯ãªãç§ãã¡ã®ãšããã«æ¥ããšæ³åããŠãã ãããããããããã¯æŽåçãªè¥è ã®æ代ã«æžãããç§ãã¡èªèº«ã®ã¯ã©ã¹ã§ãã
ããããŒãã¡ã€ã«ã«ã¯279è¡ãå®è£ ãã¡ã€ã«ã«ã¯2948è¡ããããŸãã
ããã«ã¡ã¯âFãç§ã¯èŠéããŸããã§ããã
ãã®ãããªå·šå€§ãªãã¡ã€ã«ããµããŒãããããšã¯å°é£ã§ãã
ãã¹ãŠã®.mãã¡ã€ã«ãæ倧100è¡ã«ããããšããŠããŸãã æ倧150ã
ããã«ãããããããæèããããšãªããé©åãªããžãã¯ããã°ããèŠã€ããããšãã§ããŸãã
ããããŒãã¡ã€ã«WYPopoverController.h
SDKããã©ã€ãã©ãªãæ¥ç¶ãããšããããã³ã«ãšã¯ã©ã¹ã宣èšãããŸãã
@protocol WYPopoverControllerDelegate; @class WYPopoverTheme;
ããã¯ãWYPopoverThemeã¯ã©ã¹ã®ããããŒãè¿œå ããªãåªãããœãªã¥ãŒã·ã§ã³ã§ãã
WYPopoverControllerã䜿çšãããã¹ãŠã®ã¯ã©ã¹ãããŒããå€æŽããå¿ èŠãããããã§ã¯ãããŸããã
ãã ããWYPopoverThemeã¯ã©ã¹èªäœã¯åããã¡ã€ã«ã§å®£èšãããŠããŸãã
ããã«é¢ããŠã¯ãç°¡åãªã«ãŒã«ããããŸãã
1ã€ã®.hãã¡ã€ã«-1ã€
@interface
1ã€ã®.mãã¡ã€ã«-1ã€
@implementation
ã€ã³ã¿ãŒãã§ã€ã¹ã®åã®è¡ã//// ...ãã«æ³šæããŠãã ããã
圌女ã¯äœã®ããã§ããïŒ æããã«ã1ã€ã®ã€ã³ã¿ãŒãã§ã€ã¹ãçµäºããå¥ã®ã€ã³ã¿ãŒãã§ã€ã¹ãéå§ããå Žæãæ··åããªãã§ãã ããã
ããããã£ãã¡ãœãããééã£ãå Žæã«è¿œå ããã®ã¯ãšãŠãç°¡åã§ãã
åããã°ã©ããŒã¯ããã¡ã€ã«ã倧ãããªããããŠç解ãã«ãããªã£ããšæããããšããããŸãã ãã®ç æ°ã®çç¶ã«ã¯ãã¡ãœããã®ããããããŠã³ãªã¹ãã®é »ç¹ãªäœ¿çšãŸãã¯ãã¡ã€ã«æ€çŽ¢ïŒâFïŒãå«ãŸããŸãã
å¥ã®çç¶ã¯ãïŒpragmaããŒã¯ãæ¿å ¥ããããšãã欲æ±ã§ãã
ç§ã¯ãã§ã«ç æ°ã§ãããããªãã®ããã®æ²»çæ³ã§ãã
#pragma markãŸã㯠"//// ..."ã®åœ¢åŒã®è¡ã䜿çšããªãã§ãã ãããããã¯äœãå€æŽããŸãããæåã«ã©ãã«ãæ€çŽ¢ããã¡ãœããã®ä»£ããã«ã®ã¿ã
æåã«è¡ãããšã¯ãã¯ã©ã¹ãåå¥ã®ãã¡ã€ã«ã«é 眮ããããšã§ãã 次ã«
@class
å¿ èŠãªãã®ã
@class
宣èšããŸãã
#import
ãæå°åããŠãããããŒãå€æŽããããã³ã«ã°ããŒãã«ã«åã³ã³ãã€ã«ãããªãããã«ããŸãã
å®æ°
#define WY_POPOVER_DEFAULT_ANIMATION_DURATION .25f #define WY_POPOVER_MIN_SIZE
ãã©ã€ããŒãããããŒãã¡ã€ã«ã§åé€ããå¿ èŠãããå®çŸ©ã ãããã¯ããã©ã«ãå€ã§ãã
ããããç¥ãããå Žåã¯ãå®è£ ã«å ¥ããŸãã
ããã«ãå®æ°ã¯constã䜿çšããŠãã®ããã«å®çŸ©ããå¿ èŠããããŸã
const CGFloat kAbc = 0.25;
ã
å®æ°ã宣èšããå¿ èŠãããå ŽåïŒ
FOUNDATION_EXPORT const CGFloat kAbc;
NS_OPTIONSã䜿çšããŠåæããŸãã
ã³ã³ãããŒã©ãŒãåŒã³åºãã«ã¯ããã®ã¿ã€ããç¥ãå¿ èŠããããŸãã ãããŠãã³ã³ãããŒã©ãŒã¯ãã®ç¥èãæäŸããå¿ èŠããããŸãã ããããå¥ã®ããããŒã«å ¥ãã䟡å€ããããããããŸããã ãŸãã倧äžå€«ãããã¯ã¡ãã£ãšããéžæã§ãã
@interface WYPopoverController"
@interface WYPopoverController"
UIAppearanceContainerããµããŒãããŠããŸãã 1ã€ã®å Žæã§ç°¡åã«æ§æã§ããŸãã ãã©ã¹èšå·ã 詳现ã¯ãã¡ã ã
ããããã£
ããããã£ã®ãªã¹ããã³ã³ãã€ã«ãããçç±ããã©ã®ãããªååã§ç解ããŠããªãã®ã§ããã å®è£ æã«ããããŒã«è¿œå ãããããã§ãã
ãããã¯ã«ããªã²ãŒãããããããæ®ãã®èšå®ãã«ããŽãªãŸãã¯ã¢ã«ãã¡ãããé ã«ã°ã«ãŒãåããŸããïŒhaveAã«èšå®ãããŠããŸãïŒã
@property (nonatomic, assign) BOOL dismissOnPassthroughViewTap; @property (nonatomic, assign) BOOL dismissOnTap; @property (nonatomic, assign) BOOL implicitAnimationsDisabled; @property (nonatomic, assign) BOOL wantsDefaultContentAppearance; @property (nonatomic, assign) CGSize popoverContentSize; @property (nonatomic, assign) float animationDuration; @property (nonatomic, assign) UIEdgeInsets popoverLayoutMargins; @property (nonatomic, copy) NSArray *passthroughViews; @property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible; @property (nonatomic, strong) WYPopoverTheme *theme; @property (nonatomic, strong, readonly) UIViewController *contentViewController; @property (nonatomic, weak) id <WYPopoverControllerDelegate> delegate; @property (nonatomic, copy) void (^dismissCompletionBlock)(WYPopoverController *dimissedController);
ã¡ãªã¿ã«ãassignã¯ãªãã·ã§ã³ã§æ¬¡ã®ããã«èšè¿°ã§ããŸãã
@property (nonatomic) BOOL dismissOnPassthroughViewTap;
popoverVisibleã®getterãisPopoverVisibleãšããŠå®çŸ©ãããŠããã®ã¯è¯ãããšã§ãããã®ããããã£ã¯ãªããžã§ã¯ãã®ç¶æ ã«é¢ãã質åã«çããã®ã§ã次ã§å§ãŸããŸãïŒ
@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;
ãã ããdismissOnTapãªã©ã§ã¯ãã«ã¹ã¿ã getterãäœæããå¿ èŠããããŸãã
@property (nonatomic, assign) BOOL dismissOnTap;
ãã®ããããã£ã¯ãç¹å®ã®ã€ãã³ãäžã«ãªããžã§ã¯ãã«äœãèµ·ããããšãã質åã«çããŸãã
å ·äœçã«ã¯ãtapuã§äœãããå¿ èŠããããã
ãã®ãããªãªãã·ã§ã³ã®å Žåãæ¥é èŸã«getterãå®çŸ©ããŸãïŒè±èªãééã£ãŠäœ¿çšããå Žåã¯ä¿®æ£ããŸãïŒã
@property (nonatomic, getter=willDismissOnTap) BOOL dismissOnTap;
è¿œå ã®è²¬ä»»
+ (void)setDefaultTheme:(WYPopoverTheme *)theme; + (WYPopoverTheme *)defaultTheme;
ããŒããªããžã§ã¯ããããå Žåãããèªäœãããã©ã«ãç¶æ ãå¶åŸ¡ããå¿ èŠããããŸãã
ã¯ã©ã¹ã«è²¬ä»»ãè¿œå ããã®ã¯ãªãã§ããïŒ
WYPopoverThemeãžã®è»¢éã
ããããã¯ã©ã¹ã¡ãœããã¯ã¡ãœããã®ãªã¹ãã®äžçªäžã«ãªããã°ãªããªãããšã«åæããŸãã
åæå
- (id)initWithContentViewController:(UIViewController *)viewController;
ææ¡ãããã¡ãœããã¯[self init]ãåŒã³åºããŸããã€ãŸãã䜿çšããåã«ãªããžã§ã¯ããå¿ èŠãªããŒã¿ããã¹ãŠåæåããããšã確èªã§ããŸãã
ããããããã«ã€ããŠèª¿ã¹ãã«ã¯ããœãŒã¹ã調ã¹ãå¿ èŠããããŸããã
ãã ããåã«initãåŒã³åºãå ŽåãcontentViewControllerãèšå®ããæ¹æ³ã¯ãããŸããã ãªããªã 圌ã¯èªã¿åãå°çšã§ãã
ãããã£ãŠã䜿çšããå¿ èŠããªãã¡ãœãããšããŠintãããŒã¯ããç®çã®åæåã¡ãœãããšããŠinitWithContentViewControllerãããŒã¯ããå¿ èŠããããŸãã
ãã以å€ã®å Žåã¯ãalloc initãäœæããããšã§ãé·ãé銬鹿ãªããšãã§ããŸãã
ãã®ãããªæ¹æ³ããããŸãã
NS_DESIGNATED_INITIALIZERã䜿çšããŠãç®çã®åæåæ¹æ³ãã¯ã©ã€ã¢ã³ãã«ç€ºããŸãã
ãã®æ¹æ³ã§ããã€ãã®ã¡ãœãããããŒã¯ã§ããŸãã
ã¹ãŒããŒã¯ã©ã¹ã¡ãœãããããŒã¯ããããšãã§ããŸãã
ãã®ããã«
- (id)init NS_DESIGNATED_INITIALIZER;
次ã«ãééã£ãåæååãåŒã³åºããšãXcodeã«ã³ãŒãã³ã°ã衚瀺ãããŸãïŒãšã©ãŒããããŸãïŒã
ã¡ãœããã¯idãè¿ããŸãã
instancetypeã䜿çšããããšããå§ãããŸã ã ãã®åŸãã¡ãœããã¯åžžã«ãåŒã³åºãå ã®ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãè¿ããŸãã ããšã圌ããåŒãç¶ãã ãšããŠãã
ãã«ããŒã¡ãœãã
// theme - (void)beginThemeUpdates; (void)endThemeUpdates;
ã³ã¡ã³ãã«æ°ã¥ããŸãããïŒ ãããçç¶ã§ã-ããããŒãã¡ã€ã«ã倧ããããŸãã
ãã®åé¡ãããã«è§£æ±ºããŸãã
ã»ã¯ã·ã§ã³ã//ã¯ã©ã·ãã¯ãã¥ãŒã¡ãœããããããããªãŒããŒã衚瀺ã
ããã¯æ¬åœã®ç æ°ã§ãã ãã¡ã€ã«ã倧ãããªããããŠããŸã-ããããŒãå ±æããå¿ èŠããããŸãã
ãããè¡ãã«ã¯ãã«ããŽãªã䜿çšããŸãã
Appleã®.hãã¡ã€ã«ïŒUIView.hãªã©ïŒããå€æãããšã圌ããåæ§ã§ãã
ãã®ã»ã¯ã·ã§ã³ã®ã¡ãœããã䜿çšããŠãã//ããŒãã¿ã³ã¢ã€ãã ã¡ãœããããããããªãŒããŒã衚瀺ãããPresentationFromViewã«ããŽãªãäœæããŸãã
âN-> iOS-> Source-> Objective-C File

ãããã®ã¡ãœããã®å®è£ ããã¡ã€ã«WYPopoverController + PresentationFromView.mã«è»¢éããŸãã
WYPopoverControllerã€ã³ã¿ãŒãã§ã€ã¹ã®åŸã«WYPopoverController + PresentationFromView.hããWYPopoverController.hã«ã€ã³ã¿ãŒãã§ã€ã¹ãã³ããŒããããã«ã¡ãœãã宣èšã転éããŸãã
ãã¡ã€ã«WYPopoverController + PresentationFromView.hãåé€ãããŸãã
äžè¬ã«ã.hãã¡ã€ã«ãäžèŠãªã«ããŽãªã«ã¯ç¹å¥ãªãã³ãã¬ãŒããçšæããæ¹ãç°¡åã§ãã
次ã®ããã«ãªããŸãã
@interface WYPopoverController (PresentationFromView) - (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(WYPopoverArrowDirection)arrowDirections animated:(BOOL)animated; âŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠâŠ @end
ãããã®ã¡ãœããã¯ãããªãã¯ãªã®ã§ã宣èšã¯WYPopoverController.hã«ãããŸãã
ã«ãã»ã«å
ãã¹ãŠã®.mãã¡ã€ã«ã§ã€ã³ããŒãããå¿ èŠããããŸãã
#import "WYPopoverController_Private.h"
ãã®äžã«ãããŸããŸãªã«ããŽãªã®äœæ¥ã«å¿ èŠãªãã¡ã€ã«ãã€ã³ããŒãããå¿ èŠããããŸãã
1ã€ã®ã«ããŽãªã«ã®ã¿å¿ èŠãªãã¡ã€ã«ã¯ãç¹å®ã®ã«ããŽãªã®.mãã¡ã€ã«ã«ã€ã³ããŒãããå¿ èŠããããŸãã
ããã§ããã¹ãŠã®ãã©ã€ããŒãããããã£ãšã¡ãœããã宣èšããŸãã
çžç¶äººã䜿çšããããããŒãã¡ã€ã«ãå¿ èŠãªå Žåã¯ãProtectedãšåŒã°ããŸãã
1ã€ã®è«çã°ã«ãŒãã«åž°ããããšãã§ãããã¹ãŠã®ã¡ãœããã§åãããšãè¡ããŸãã
.mãã¡ã€ã«ã倧ãããªããããŠããå Žåã¯ãå¥ã®ã«ããŽãªã匷調衚瀺ããŸãã
ãã ããç¡çãããªãã§ãã ããã4ã5åã®ã«ããŽãªãæ倧ã§ãããã以å€ã®å Žåã¯ãæ··ä¹±ãå§ããå¯èœæ§ããããŸãã
ããã«å¿ èŠãªå Žåã¯ãã¯ã©ã¹ã«ããŸãã«ãå€ãã®è²¬ä»»ãäžããããšããŠããå¯èœæ§ããããŸãïŒ ç¥ãªããžã§ã¯ã ïŒã ãã®å Žåããããã®è²¬ä»»ãå¥ã®ã¯ã©ã¹ã«åããŸãã ãã®ãããªã¹ãŒããŒã¯ã©ã¹ãæ¬åœã«äœæããå¿ èŠãããå Žåã¯ããã¡ãµãŒããäœæããŸãã
ãã¡ãããå®è£ åã«ã¯ã©ã¹ãèšèšããããšããå§ãããŸãããåžžã«æ©èœãããšã¯éããŸããã
ã«ããŽãªã¯æ©èœãå®å šã«åé¢ããã®ã«åœ¹ç«ã¡ãŸãã ãã®åŸãèŠåŽããã«å¥ã®ã¯ã©ã¹ã«å®è¡ã§ããŸãã
ã¯ã©ã¹ãããã€ãã®åå¥ã®ã¯ã©ã¹ã«åå²ããå Žåã2ã€ã®ã¯ã©ã¹éã®å€æ°ã®åŒã³åºããé¿ããŠãã ããã
ããããªããšãã³ãŒãã®æ¥ç¶æ§ãé«ããªããåé¢ã®æå³ããªããªããŸãã ãªããžã§ã¯ãã¯ã1ã€ã®ã¡ãœãããåŒã³åºããããã©ãã¯ããã¯ã¹ã§ãããããŒã¿ãåŠçããåŸãå察æ¹åã«1ã€ã®ã¡ãœãããåŒã³åºããŸãã ã¹ã€ã¹ã®ãã€ãã¯ãããŸããã
ã«ããŽãªã¯ããããã³ã«ã¡ãœãããé 眮ããã®ã«é©ããå Žæã§ãã
ãããè¡ããŸãïŒ
@interface WYPopoverController (TableView) <UITableViewDataSource, UITableViewDelegate>
ãŸãã¯ãIBActionãUserActionsã«ããŽãªã«å ¥ããŸãã
å°ãåãŸã§ãXcodeã¯å®è£ ãã¡ã€ã«ã§IBActionãå®çŸ©ããããšãåŠã³ãŸããã
ãã ããããããŒã§ãããã宣èšããå¿ èŠããããŸããããããã°ãå®è£ ãã©ãã«ããããç°¡åã«ç解ã§ããŸãã
1ã€ã®ã«ããŽãªã§ãããªãã¯ã¡ãœãããšãã©ã€ããŒãã¡ãœãããå®çŸ©ããå¿ èŠãããå ŽåããããŸãã
次ã«ãWYPopoverController.hã«TableViewã«ããŽãªãè¿œå ããŸãã
WYPopoverController_Private.hã®ã«ããŽãªã¯TableView_Privateã§ãããå®è£ ãã¡ã€ã«ã¯WYPopoverController + TableView.mã«ãªããŸãã
ãããžã§ã¯ãã®ã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã

åã®èšäºãžã®ã³ã¡ã³ãã§ã greenkaktusã¯ã#pragmaã#warningã// FIXMEãã®äœ¿çšæ¹æ³ã説æããããææ¡ããŸããã
ç¹å®ã®å Žæã§æžŠãç¡å¹ã«ããå¿ èŠãããå Žåã«ã®ã¿#pragmaã䜿çšããŸãã
ãããå¯äžã®çã®æ¹æ³ã§ãããšç¢ºä¿¡ããŠããå Žåã«ã®ã¿ãç§ã¯ãããéåžžã«æ éã«äœ¿çšããŸãã
#pragma markã¯äœ¿çšããŸããã ç§ã¯ããã°ã©ããŒãå®èŠã§å©ããŸããã
#warningã¯äœ¿çšããŸããããšã©ãŒãšããŠæ±ãããŸãã ããã€ãã®è©³çŽ°ã¯ååã®èšäºã«ãããŸãã
å°æ¥ã®æããããšããŠã// TODOãã䜿çšããŸãã ããšãã°ãè² è·ã®å¢å ã«äŒŽãæé©åãå¿ èŠã«ãªãå¯èœæ§ã®ããããã«ããã¯ãèŠãããå Žåã
"// FIXME"ä¿®æ£ãå¿ èŠãªå Žæã§äœ¿çšããŸãããå°ãåŸã§ãã
ãã®ã³ãŒãã®å質ã«ã€ããŠã¯ãŸã å€ãã®ã³ã¡ã³ãããããŸããããã®ãããã¯ã¯å¥ã®èšäºã«å€ããŸãã
次ã®èšäºã§ã¯ãAPIãæäœããããã«äœ¿çšããã¯ã©ã¹ã®ããã€ã¹ã«ã€ããŠèª¬æããäºå®ã§ãã
ã§ããã ãæè»ã§èªååãããèšèšãè©Šã¿ãŸããã
ãã®ãããapiã¡ãœãããžã®æ°ããåŒã³åºãã®è¿œå ãšå¿çã®è§£æã¯ãæ°è¡ã§å®è¡ã§ããŸãã
ææ¡ãã³ã¡ã³ãã¯å€§æè¿ã§ãã
æåŸãŸã§èªãã§ãããŠããããšãã