ããã«ã¡ã¯ãHabrã®èŠªæãªãèªè ïŒ
ãã®èšäºã¯ãiOS Developer Notesã·ãªãŒãºã®ç¬¬2éšã§ãã
å 容ïŒ
- ããŒã1ïŒãã¡ã€ã«ã®æäœã ã·ã³ã°ã«ãã³ãã³ãã¬ãŒãã ãªãŒãã£ãªãæäœããŸãã ãããªãæäœããŸãã ã¢ããªå è³Œå ¥
- ããŒã2ïŒç¬èªã®ãããã¢ããã Navigation Controllerã§ã¢ãŒãã«ã»ã°ãšã䜿çšããæ¹æ³ã ã³ã¢ã°ã©ãã£ãã¯ã¹ UIWebViewããã³ScrollViewã䜿çšãã
- ããŒã3ïŒèªåã¬ã€ã¢ãŠãã®ãªãç掻ã ã¹ãã©ãã·ã¥ã¹ã¯ãªãŒã³ iOS 6以éã§ããã€ã¹ã®åããæäœããŸãã UITextFieldã³ã³ãã³ãã·ãã
- ããŒã4ïŒGoogle Analytics; ããã·ã¥éç¥ PSPDFKit; Facebookçµç±ã§ã¢ããªã±ãŒã·ã§ã³ã«ãã°ã€ã³ããŸãã åéã«ç¥ããã-FacebookãTwitterãã¡ãŒã«
- ããŒã5ïŒã³ã¢ããŒã¿ã UITableViewããã³UICollectionView
ããã¯ããªãåºç¯ãªãããã¯ãªã®ã§ãã«ã¹ã¿ãã€ãºå¯èœãªãããã¢ãããèšäºã®æåŸã§æ±ããŸãã ãããŸã§ã®éãä»ã®ãã¹ãŠã
Navigation Controllerã§ã¢ãŒãã«ã»ã°ãšã䜿çšããæ¹æ³
ãã®ãããåé¡ããããŸããã¯ã©ã€ã¢ã³ãã¯æšæºã®Navigation Controllerãã©ã³ãžã·ã§ã³ïŒãå³ãžã®ãªãŒããŒã©ãããïŒã奜ãŸãªããããããšãã°ãç»é¢ãäžããåããããšã«ãã£ãŠæ°ããç»é¢ã衚瀺ããããšèããŠããŸãã ããã«åé¡ã®è§£æ±ºçãããããŸããã»ã°ãšã®è¡šç€ºãã¢ãŒãã«ã«å€æŽããŸãã ãã¹ãŠã¯åé¡ãããŸããããç»é¢ã®éå±€ãæã€Navigation Controllerã®ããžãã¯ã¯å£ããŠããŸãã ãã®çµæãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã ã¢ãŒãã«ã»ã°ãšãå¿ èŠã«ãªããŸããããããã·ã¥ã»ã°ãšæ©èœãå¿ èŠã§ãã ãã®åé¡ã解決ããç°¡åãªæ¹æ³ããããšæããŸãããUIStoryboardSegueã®ãµãã¯ã©ã¹ãèšè¿°ããããšããå§ãããŸãã å€æŽããå¿ èŠãããã®ã¯ãã¯ã©ã¹ã®.mãã¡ã€ã«ã ãã§ãã ããå ·äœçã«ã¯ã performã¡ãœããïŒ
æŒããŠïŒ
- (void) perform{ // , UIViewController *src = (UIViewController *) self.sourceViewController; UIViewController *dst = (UIViewController *) self.destinationViewController; // [UIView transitionFromView:src.view toView:dst.view duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom completion:nil]; // Navigation Controller'a [UIView transitionFromView:src.navigationItem.titleView toView:dst.navigationItem.titleView duration:1 options:UIViewAnimationOptionTransitionFlipFromBottom completion:nil]; // Push Segue [src.navigationController pushViewController:dst animated:NO]; }
UIViewAnimationOptionTransitionFlipFromBottomã®ä»£ããã«ãã¯ã©ã€ã¢ã³ãã®äžå¿ã«è¿ããã©ã³ãžã·ã§ã³ã¹ã¿ã€ã«ãé 眮ã§ããŸãã
以äžã§ãïŒ ãªããŠç°¡åãªã®ã§ãããã ããã§ãã¹ããŒãªãŒããŒãã»ã°ãšã®ã«ã¹ã¿ã ã¹ã¿ã€ã«ãæå®ããæ°ããã¯ã©ã¹ãæå®ããŠãé·ç§»ã¿ã€ãã§Navigation Controllerã»ã°ãšãååŸã§ããŸãã
ã³ã¢ã°ã©ãã£ãã¯ã¹
ããæç¹ã§ãã¯ã©ã€ã¢ã³ãã¯ãã¿ã³ã®å¹ ã5ãã¯ã»ã«ãã€å€æŽããå¿ èŠããããã³ã«ãã¶ã€ããŒã蹎ãã®ã«ããããããŠããŸãïŒçµå±ã®ãšããããã¿ã³ããšã«ãã¶ã€ããŒãå¥ã ã®çµµãæããïŒã QuartzCore.frameworkã䜿çšããŠãäžžã¿ã垯ã³ãçžãšå¢çç·ãæã€ç¬èªã®ãã¿ã³ãäœæããŸãã ç¹°ãè¿ããŸãããã·ã³ã°ã«ãã³ã®å Žåãšåæ§ã«ããããžã§ã¯ãã®äœæ¥ãé«éåããã¹ããããã®ãããªãã®ã§ãã
å®éããã®ã¢ãããŒãã¯UIViewã®ãµãã¯ã©ã¹ã§äœ¿çšã§ããŸãïŒUIButtonã¯ãŸãã«ããã§ãïŒã UIViewã®awakeFromNibã¡ãœãããæžãæããŸãã
- (void)awakeFromNib { [super awakeFromNib]; self.layer.cornerRadius = 5.0f; self.layer.masksToBounds = YES; self.layer.borderColor = [UIColor whiteColor].CGColor; self.layer.borderWidth = 1.0f; }
ãã¹ãŠãã·ã³ãã«ã§ãã ãŸããç¶æ¿ã§ã¯ãã¹ãŒããŒã¯ã©ã¹ãäœæ¥ãå®äºããåŸã«ã³ãŒããå®è¡ããå¿ èŠããããŸãã ãã®ãããåãã¡ãœãããã¹ãŒããŒã¯ã©ã¹ã§åŒã³åºããŸãã 次ã«ããã®çš®ã®ã¬ã€ã€ãŒã®è§ã®æ²çååŸãèšå®ããã¬ã€ã€ãŒãæå®ããããã¹ã¯ã«åŸãããã«ããŸãã 第äžã«ããã¬ãŒã ã®è²ïŒãã¡ããCGColorïŒãšãã®åããèšå®ããŸãã
ã°ã©ãã£ãã¯ã³ã³ããã¹ãã§æ·±ãäœæ¥ãæåŸ ããŠãã人ãããããšã¯ç¥ã£ãŠããŸãããã ããããããªãŒã©ã³ãµãŒã«ãšã£ãŠã¯é«éããŒãã·ãŒãã§ããCoreGraphicsã®æ°ããã¿ã¹ã¯ãç»å ŽããããèšäºãæžããŸãã
UIWebViewããã³ScrollViewã䜿çšãã
ãã§ã«UIWebViewããããŸããã³ã³ãã³ããããŒãããŠã¿ãŸãããã
NSString *htmlString; NSString *cssString; <... ...> htmlString = [NSString stringWithFormat:@"<style>%@</style>%@", cssString, htmlString]; NSURL *url = [[NSURL alloc] initFileURLWithPath:pathToApplicationDirectory]; [self hideOverscrollShadowsForWebView:webView]; [webView loadHTMLString:htmlString baseURL:url];
ç§ãã¡ã®ã¹ã¿ã€ã«ãšhtmlã®WebããŒãžãååŸããŸããã UIWebViewã®ãªãŒããŒã¯ããã¯äžã«äžå¿«ãªç°è²ã®åœ±ãé ãããã«ã次ã®ã¡ãœããã䜿çšããŸããã
/*! , UIWebView \param webView WebView, */ - (void)hideOverscrollShadowsForWebView:(UIWebView *)webView { id scrollview = [webView.subviews objectAtIndex:0]; for (UIView *subview in [scrollview subviews]) if ([subview isKindOfClass:[UIImageView class]]) subview.hidden = YES; webView.backgroundColor = [UIColor clearColor]; }
UIWebViewã«å±ããScrollviewãããã¹ãŠã®åãã¥ãŒãé衚瀺ã«ããŸãã ãŸããéæãªèæ¯ãèšå®ããŸãã
UIScrollViewã«ã€ããŠèšãã¹ãããšã¯1ã€ã ãã§ããcontentSizeããããã£ãèšå®ããããšãå¿ããªãã§ãã ããã
ã«ã¹ã¿ã ãããã¢ãã
ãã®èšäºã®å·šäººã«ã€ããŠè©±ãæãæ¥ãŸããã ä»åãã¯ã©ã€ã¢ã³ãã¯ãåå ããã«ãããã¢ããã®å€èŠ³ããã°ããå€æŽããæ©èœãå¿ èŠãšããŠããŸããã ãŸããä»äºã®ããã«ïŒ
çè«ãç§ãã¡å šå¡ãã©ã®ããã«ç©äºãæãéãããã«ã€ããŠå°ã話ããŸãããã
ã¹ããŒãªãŒããŒãã§ã¯ãæ¬æ Œçãªãããã¢ãããŠã£ã³ããŠãå®è£ ããããšã¯ã§ããŸããããå¥ã®PopupView.xibãã¡ã€ã«ãäœæã§ããŸãã
ã¢ãã«ãšããŠã3ã€ã®ã¯ã©ã¹PopupViewãPopupControllerãPopupControllerDelegateãäœæããŸãã
æåã«ãã¹ã¯ãªãŒã³ã·ã§ããã®ããã«ãããã¢ãããŠã£ã³ããŠã®ã¬ã€ã¢ãŠããçµã¿ç«ãŠãŸãã ãã®å Žåããã¡ã€ã«ã®ææè ã¯PopupControllerã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãªãããã¥ãŒèªäœã¯PopupViewã¯ã©ã¹ã®ãªããžã§ã¯ãã«ãªããŸãã èæ¯ãã¥ãŒã¯ãåéæã®æããç°è²ã®UIViewã§ãã
æåã«PopupView.hã®å®è£ ãèŠãŠã¿ãŸãããã
æŒããŠïŒ
#import <UIKit/UIKit.h> @interface PopupView : UIView @property (strong, nonatomic) IBOutlet UIView *backgroundView; @property (strong, nonatomic) IBOutlet UIView *innerPopupView; @property (strong, nonatomic) IBOutlet UILabel *popupTitleLabel; @property (strong, nonatomic) IBOutlet UILabel *popupTextLabel; @property (strong, nonatomic) IBOutlet UIButton *popupButton; @end
ãã¹ãŠã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹èŠçŽ ãã³ãŒãã«ããã¯ããŸããã PopupView.mã¯å€æŽãããæšæºã®çæã³ãŒããæ®ããŸããã
ãããã¢ãããŠã£ã³ããŠãã³ãã¬ãŒãããããŸãããä»ã§ã¯å·§ã¿ã«äœ¿çšããå¿ èŠããããŸãã PopupControllerãäœæããŸãã
PopupController.h ïŒ
æŒããŠïŒ
#import <Foundation/Foundation.h> #import "PopupControllerDelegate.h" #import "PopupView.h" @interface PopupController : NSObject // UIViewController, PopupView @property (strong, nonatomic) UIViewController<PopupControllerDelegate> *delegate; // . ! @property (strong, nonatomic) NSMutableArray *activePopups; - (IBAction)touchedButton:(UIButton *)sender; - (id)initWithDelegate:(UIViewController<PopupControllerDelegate> *)delegate; - (void)showHelloWorldPopup; - (void)dismissAllPopups; @end
å¿ èŠãªããããã£ãšãåæåã®ããã®ãããªãã¯ã¡ãœãããèšå®ããç°¡åãªãããã¢ãããŠã£ã³ããŠã衚瀺ãããã¹ãŠã®ãããã¢ãããŠã£ã³ããŠãéããã ãã§ããã ãŸããPopupControllerã®ãããã¢ããå ã®ãã¿ã³ã«å°ããªã¢ã¯ã·ã§ã³ãè¿œå ããŸããã
PopupController.m ïŒ
æŒããŠïŒ
#import "PopupController.h" @implementation PopupController - (id)initWithDelegate:(UIViewController<PopupControllerDelegate> *)delegate { self = [super init]; if (self) { // self.activePopups = [NSMutableArray array]; // self.delegate = delegate; } return self; } - (void)showHelloWorldPopup { PopupView *popup = [self popupFromRestorationID:@"text"]; [self configurePopup:popup]; [self showPopup:popup]; } - (IBAction)touchedButton:(UIButton *)sender { [self.delegate touchedPopupButton:sender]; } - (void)dismissAllPopups { for (UIView *popup in activePopups) { [self hidePopup:popup]; } } <...>
åæåäžã«ãããã«ã¯ã©ã¹ã®ããªã²ãŒããèšå®ããŸãã
èªã¿ãããããããã«ã showHelloWorldPopupã¡ãœããã®ã³ãŒããä»ã®3ã€ã®ã¡ãœããã«åå²ããŸããããããã¢ãããŠã£ã³ããŠãåæåããæ§æãã衚瀺ããŸãã
ãŠãŒã¶ãŒããããã¢ãããŠã£ã³ããŠã®ãã¿ã³ã«è§Šãããšãããã«ã€ããŠããªã²ãŒãã«éç¥ããŸãã
dismissAllPopupsã¡ãœããã¯ãå ±æé åå ã®ãã¹ãŠã®ãããã¢ãããåçŽã«èµ°æ»ããŠããããããéããŸãã
äžè¶³ããŠããã¡ãœãããã¯ãªãŒã³ã¢ããããŸãããïŒ
æŒããŠïŒ
<...> - (PopupView *)popupFromRestorationID:(NSString *)restorationID { // .xib NSArray *allViews = [[NSBundle mainBundle] loadNibNamed:@"PopupView.xib" owner:self options:nil]; // for (PopupView *view in allViews) { // restorationIdentifier , , , if ([view.restorationIdentifier isEqualToString:restorationID]) { view.alpha = 0.0f; [self.delegate.view addSubview:view]; return view; } } // ! return nil; } - (void)showPopup:(PopupView *)popup { // innerPopupView 50% [popup.innerPopupView setTransform:CGAffineTransformMakeScale(0.5, 0.5)]; // [UIView animateWithDuration:0.2f animations:^{ // popup.alpha = 1.0f; // 100% [popup.innerPopupView setTransform:CGAffineTransformMakeScale(1.0, 1.0)]; }]; // [popup.backgroundView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissAllPopups)]]; // [activePopups addObject:popup]; } - (void)hidePopup:(UIView *)popup { // [UIView animateWithDuration:0.2f animations:^{ // popup.alpha = 0.0f; } completion:^(BOOL finished){ // ViewController'a [popup removeFromSuperview]; }]; // , [activePopups removeObject:popup]; } - (void)configurePopup:(PopupView *)popup forName:(NSString *)name { // popup.popupTitleLabel.text = @"Popup Title"; // popup.popupTextLabel.text = @"Hello World!"; // [self setTitle:@"Okay"]; } - (void)setTitle:(NSString *)title forButton:(UIButton *)button { [button setTitle:title forState:UIControlStateNormal]; [button setTitle:title forState:UIControlStateSelected]; [button setTitle:title forState:UIControlStateHighlighted]; [button setTitle:title forState:UIControlStateDisabled]; } @end
é çªã«ãã¹ãŠã®ããªãã¯ïŒ
- UIViewã䜿çšããã¢ãã¡ãŒã·ã§ã³ïŒanimationsïŒãããã¯ã«èšè¿°ãããŠãããã¹ãŠã®ãã®ã¯ãèšå®ãããæéããããŠåŸã ã«å®è¡ãããŸãã completionïŒãããã¯ã®ã³ãŒãã¯ã ã¢ãã¡ãŒã·ã§ã³ãããã¯ã®çŽåŸã«å³åº§ã«å®è¡ãããŸãã
- ãŠãŒã¶ãŒãã°ã¬ãŒã®æ·¡è²è¡šç€ºãã¯ãªãã¯ãããšããããã¢ãããããã«æ¶ããŸã
- 1ã€ã®ç¶æ ã®ãã¿ã³ããã¹ããèšå®ããã ãã§ãä»ã®ç¶æ ã®ããã¹ãã¯å€æŽãããªãããã setTitleïŒforButtonïŒã¡ãœããã¯ãã¹ãŠã®ç¶æ ã®ãã¿ã³ããã¹ããäžåºŠã«å€æŽããŸã
åæ§ã®ãããã¢ããã¢ãŒããã¯ãã£ãäœæããããšã«ãããã¯ã©ã€ã¢ã³ãã¯åå ããã«ãŠã£ã³ããŠã®å€èŠ³ãå€æŽã§ããŸãã ã¯ã©ã€ã¢ã³ããèŠçŽ ã®è²ããµã€ãºãé 眮ãå€æŽã§ããããã«ããŸããã³ãŒããšã®æ¥ç¶ã«è§Šããªãéãããã¹ãŠãæ£åžžã«æ©èœããŸãã
ããŠããããŠæåŸã«ãç§ãã¡ã®ã¯ã©ã¹ãã©ã®ããã«æ©èœãããã玹ä»ããŸãã PopupControllerDelegate.hãè¿œå ããŸã ã
#import <Foundation/Foundation.h> @protocol PopupControllerDelegate @required - (void)touchedPopupButton:(UIButton *)sender; @end
ãããã¢ãããŠã£ã³ããŠã衚瀺ãããUIViewControllerã¯ããã®ãŠã£ã³ããŠã®ã€ãã³ããåŠçããPopupControllerDelegateãããã³ã«ã«å¿çã§ããå¿ èŠããããŸãã
ããšãã°ããã¥ãŒãèªã¿èŸŒãã åŸã«HelloWorldãŠã£ã³ããŠã衚瀺ããŸããããã¯ãç®çã®ãããã³ã«ã«å¿çãããã§ã«åæåãããpopupControllerãªããžã§ã¯ããæã£ãŠããŸãã 次ã®ã³ãŒããviewDidAppearã«è¿œå ããŸãã
[popupController showHelloWorldPopup];
ãããŠããããã¢ããã€ãã³ããã³ãã©ãŒãè¿œå ããŸãã
- (void)touchedPopupButton:(UIButton *)sender { // [popupController dismissAllPopups]; }
ãããã«
æåŸãŸã§èªãã§ãããŠããããšãïŒ
èšäºã®2çªç®ã®éšåã¯ããã³ã¯ãŒããŒã«é£ã¶åã«ãã¢ãžã§ããŽã©ç©ºæž¯ã§æžãããŸããã å€é ããã³ãŒããŒããªããªã£ãã
次ã®èšäºã¯ããã«èå³æ·±ããããã¯ã«ãªããŸãïŒãœãŒã·ã£ã«ãããã¯ãŒã¯ã§ã®ã³ã³ãã³ãã®å ±æãPSPDFKitãããã·ã¥éç¥ã