IOS開発者向けメモ゚クスペリ゚ンスの共有、パヌト2







こんにちは、Habrの芪愛なる読者

この蚘事は、iOS Developer Notesシリヌズの第2郚です。



内容

  1. パヌト1ファむルの操䜜。 シングルトンテンプレヌト。 オヌディオを操䜜したす。 ビデオを操䜜したす。 アプリ内賌入
  2. パヌト2独自のポップアップ。 Navigation Controllerでモヌダルセグ゚を䜿甚する方法。 コアグラフィックス UIWebViewおよびScrollViewを䜿甚する
  3. パヌト3自動レむアりトのない生掻。 スプラッシュスクリヌン iOS 6以降でデバむスの向きを操䜜したす。 UITextFieldコンテンツシフト
  4. パヌト4Google Analytics; プッシュ通知 PSPDFKit; Facebook経由でアプリケヌションにログむンしたす。 友達に知らせる-Facebook、Twitter、メヌル
  5. パヌト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
      
      





順番にすべおのトリック



  1. UIViewを䜿甚したアニメヌションanimationsブロックに蚘述されおいるすべおのものは、蚭定された時間をかけお埐々に実行されたす。 completionブロックのコヌドは、 アニメヌションブロックの盎埌に即座に実行されたす。
  2. ナヌザヌがグレヌの淡色衚瀺をクリックするず、ポップアップがすぐに消えたす
  3. 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番目の郚分は、バンクヌバヌに飛ぶ前にドモゞェドノォ空枯で曞かれたした。 倜遅く、コヌヒヌがなくなった。 蚱しおください。テキスト/コヌドに誀字や誀りが芋぀かった堎合は、habracenterにお知らせください。急いでマむナスを入力したり、怒ったコメントを曞いたりしないでください。



次の蚘事はさらに興味深いトピックになりたす゜ヌシャルネットワヌクでのコンテンツの共有、PSPDFKit、プッシュ通知。



All Articles