Comment append un UIImage avec UIGesture à la plupart des vues dans une application.

Je veux faire une bannière publicitaire dans mon application. Un peu comme iAd.

J'allais le faire en ayant un UIImage sur la vue puis en assignant l'image de la bannière. Je voudrais ensuite append un geste tactile afin que l'user puisse cliquer dessus et passer à une autre vue dans mon application. Je sais que je peux le faire sur une vue assez facilement, mais je veux que ce soit sur la plupart des vues dans l'application. Quel est le meilleur moyen d'append la bannière à plus d'une vue sans écrire le même code plus d'une fois?

La design ci-dessous montre le type de bannière im après.

Merci

Bannières de commanditaires

Vous pouvez créer une class UIView et l'appeler BannerView par exemple. // dans le bannerView.h

#import <UIKit/UIKit.h> @interface BannerView : UIView{ UIImageView* bannerImage; } @property(nonatomic,retain) UIImageView* bannerImage; @end 

// dans le bannerView.m

 #import "BannerView.h" @implementation BannerView @synthesize bannerImage; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code bannerImage=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"banner-image.png"]]; bannerImage.frame=CGRectMake(0, 0, 320, 100); [self addSubview:bannerImage]; // add a uibutton on top of the uiimageview and assign an action for it // better than creating an action recogniser UIButton* actionButton=[UIButton buttonWithType:UIButtonTypeCustom]; actionButton.frame=CGRectMake(0, 0, 320, 100); [actionButton addTarget:self action:@selector(yourAction) forControlEvents:UIControlEventTouchUpInside]; [self addSubview:actionButton]; } -(void) yourAction{ // do what ever here like going to an other uiviewController as you mentionned } @end 

Vous pouvez maintenant appeler cette vue de n'importe quel controller de vue de cette façon

  BannerView* banner=[[BannerView alloc] initWithFrame:CGRectMake(0, 300, 320, 100)]; [self.view addSubview:banner]; 
 #import <UIKit/UIKit.h> @class custom; @protocol adDelegate - (void)viewAd:(NSSsortingng *)adRate; @end @interface custom : UIView @property (strong, nonatomic) UIImage *viewImage; @property (assign) id <adDelegate> delegate; @end 

// Classe principale

 #import "custom.h" @implementation custom @synthesize viewImage; @synthesize delegate; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; imageView.image = viewImage; [self addSubview:imageView]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { if ((self = [super initWithCoder:aDecoder])) { } return self; } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.delegate viewAd:@"view"]; } 

Essayez de créer une class parent à partir de UIView où vous faites tout l'affichage et la gestion de la bannière en utilisant votre UIImageView et les reconnaisseurs de gestes. Ensuite, quelles que soient les vues qui ont besoin de cette fonctionnalité, dérivez-les de cette class parente et remplacez la gestion par défaut dans la méthode afin de pouvoir personnaliser le comportement de votre class enfant.

Quelques suggestions:

D'abord, pourquoi ne pas simplement utiliser un UIButton au lieu d'un UIImage avec un Geste? Tout ce que vous faites, c'est répliquer la fonctionnalité du button après tout …

Deuxièmement, j'aborderais probablement le problème global en créant une class qui inclut le UIButton, comme ceci:

 @interface YourSuperViewController : UIViewController @property (nonatomic, strong) IBOutlet UIButton *adButton; - (IBAction)adTouched:(id)sender; @end 

Dans viewDidLoad pour cette class, créez le button et ajoutez-le à la vue, puis ajoutez votre logique spécifique à l' adTouched action adTouched .

Ensuite, créez le rest des vues de votre application en tant YourSuperViewController de YourSuperViewController . Ainsi:

 @interface SomeOtherViewController : YourSuperViewController 

Maintenant, le SomeOtherViewController aura automatiquement le button d'annonce et répondra correctement à une touche. Terminé!

Ce que tout le monde a dit est le meilleur moyen. Si vous avez besoin de fonctionnalités personnalisées, le sous-classment est probablement la solution.

Je voulais juste append une chose pédante. Il est important de se callbacker qu'un UIImage n'est pas une vue. Il n'y a jamais eu de UIImage sur l'écran, jamais. Un UIImage est un object model. C'est juste une collection de données. Un UIImageView est un object de vue et en tant que tel, UIImageView peut s'afficher lui-même sur l'écran.

Cela peut sembler trop pédant et nitpicky, mais il est important d'avoir ces choses sortingées dans nos têtes afin d'utiliser efficacement MVC (model, vue, controller)