我试图通过单件来处理我的iAd,因为我在几个视图控制器中使用这些横幅。现在我对这些对象存储的内容感到困惑,因为当显示广告或发生错误时,我会在每个视图控制器上以不同方式移动它们。这是我的代码:
的Singleton:
+ (MySingleton *)sharedInstance {
static dispatch_once_t once;
static MySingleton * sharedInstance;
dispatch_once(&once, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
- (id)init
{
if (self = [super init]) {
if ([ADBannerView instancesRespondToSelector:@selector(initWithAdType:)]) {
self.bannerView = [[ADBannerView alloc] initWithAdType:ADAdTypeBanner];
} else {
self.bannerView = [[ADBannerView alloc] init];
}
}
return self;
}
这里是如何实现的:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//iAd
if(![[NSUserDefaults standardUserDefaults] objectForKey:kInAppPurchaseNoAds]){
self.bannerView = [MySingleton sharedInstance].bannerView;
self.bannerView.delegate = self;
self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, self.view.frame.size.height);
[self.view addSubview:self.bannerView];
}
}
委托方法:
- (void)showBanner
{
if(!self.isBannerVisible){
[self.view layoutIfNeeded];
[UIView animateWithDuration:0.5
animations:^{
//Restore the constraint
self.mainContainerToSuperviewConstraint.constant = 50;
//Move the banner on
self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, -50);
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
self.isBannerVisible = YES;
}];
}
}
- (void)hideBanner
{
if(self.isBannerVisible){
[self.view layoutIfNeeded];
[UIView animateWithDuration:0.5
animations:^{
//Restore the constraint
self.mainContainerToSuperviewConstraint.constant = 0;
//Move the banner off
self.bannerView.frame = CGRectOffset(self.bannerView.frame, 0, self.bannerView.frame.size.height);
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
self.isBannerVisible = NO;
}];
}
}
- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
[self showBanner];
}
- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
[self hideBanner];
}
现在我感到困惑的是,如果用户在另一个视图中还有iAd,我必须再次检查横幅视图的位置,其中带有可见横幅的矩形在让我们说从屏幕底部75而不是50?或者这些位置不影响AdBannerView但只影响每个类中的单个对象?!我的意思是,如果他在另一个视图中并且代码将横幅从底部移动到75像素,这些75像素是否存储在我的单身AdView中?那么原始视图的横幅现在为75而不是50?
答案 0 :(得分:2)
我建议不要为视图设置单例 - 一个视图实例只能是1个视图的子视图,因此您需要跟踪添加/删除它,并且每次再次添加时都需要设置框架一个子视图。你最好有一些基本视图控制器来共享实例化逻辑和横幅的控制。