我想在我的应用中制作广告横幅。有点像iAd的。
我打算通过在视图上有一个 UIImage 然后分配横幅图像来实现它。然后我会添加一个触摸手势,以便用户可以单击它并转到我的应用程序中的另一个视图。我知道我可以很容易地在一个视图上执行此操作,但我希望它出现在应用程序中的大多数视图上。将横幅添加到多个视图而无需多次编写相同代码的最佳方法是什么?
下面的设计显示了我之后的那种横幅。
谢谢
我想在我的应用中制作广告横幅。有点像iAd的。
我打算通过在视图上有一个 UIImage 然后分配横幅图像来实现它。然后我会添加一个触摸手势,以便用户可以单击它并转到我的应用程序中的另一个视图。我知道我可以很容易地在一个视图上执行此操作,但我希望它出现在应用程序中的大多数视图上。将横幅添加到多个视图而无需多次编写相同代码的最佳方法是什么?
下面的设计显示了我之后的那种横幅。
谢谢
#import <UIKit/UIKit.h>
@class custom;
@protocol adDelegate
- (void)viewAd:(NSString *)adRate;
@end
@interface custom : UIView
@property (strong, nonatomic) UIImage *viewImage;
@property (assign) id <adDelegate> delegate;
@end
// 主类
#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"];
}
尝试从 UIView 创建一个父类,在其中使用 UIImageView 和手势识别器执行横幅的所有显示和处理。然后,无论哪个视图需要此功能,都从该父类派生它们,并覆盖方法中的默认处理,以便您可以自定义子类中的行为。
几点建议:
首先,为什么不直接使用 aUIButton
而不是UIImage
带有手势的 a 呢?毕竟,您真正要做的只是复制按钮功能......
其次,我可能会通过创建一个包含 UIButton 的类来解决整体问题,如下所示:
@interface YourSuperViewController : UIViewController
@property (nonatomic, strong) IBOutlet UIButton *adButton;
- (IBAction)adTouched:(id)sender;
@end
在viewDidLoad
此类中,创建按钮并将其添加到视图中,并将您的广告特定逻辑添加到adTouched
操作中。
然后在您的应用程序中创建其余视图作为YourSuperViewController
. 像这样:
@interface SomeOtherViewController : YourSuperViewController
现在SomeOtherViewController
将自动神奇地拥有广告按钮并正确响应触摸它。完毕!
例如,您可以创建一个 UIView 类并将其称为 BannerView。// 在bannerView.h中
#import <UIKit/UIKit.h>
@interface BannerView : UIView{
UIImageView* bannerImage;
}
@property(nonatomic,retain) UIImageView* bannerImage;
@end
//在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
现在您可以通过这种方式从任何视图控制器调用此视图
BannerView* banner=[[BannerView alloc] initWithFrame:CGRectMake(0, 300, 320, 100)];
[self.view addSubview:banner];
其他人说的都是最好的方法。如果您需要自定义功能,子类化可能是要走的路。
我只是想添加一个迂腐的东西。重要的是要记住 UIImage 不是视图。屏幕上从来没有出现过 UIImage。UIImage 是一个模型对象。它只是数据的集合。UIImageView 是一个视图对象,因此,UIImageView 可以在屏幕上显示自己。
这可能看起来过于迂腐和吹毛求疵,但是为了有效地使用 MVC(模型、视图、控制器),将这些事情整理在我们的脑海中很重要