在多个 UIViewcontroller 应用程序中添加广告横幅
Adding Ad Banners in multiple UIViewcontroller app
我像 2 年前一样使用故事板构建了一个应用程序。应用程序的根视图控制器是 UINavigation 控制器,根视图控制器根据用户交互加载视图控制器。从根视图控制器,根据用户操作,可以在 UINavigation 中显示 8 个其他视图控制器。
现在我想将横幅广告添加到那个 app.The 问题是因为我最初是使用故事板和视图控制器实现应用程序的,所以我想知道在哪里添加横幅广告的代码。
我做了一些研究,看起来可能的选择是
1. 添加一个 UIViewcontroller 作为根视图控制器
2.在UIViewcontroller中添加一个ContainerView
3.从容器视图中将Exiting navigation controller设为嵌入式segue
4.添加广告横幅(想要屏幕底部的广告横幅)。
换句话说
现有
--> UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController-->
计划修改
--> UIViewController-->(has)-->Containerview-->(embed segue)-->UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController -->
我想知道的是,在我的案例中,这是实施广告横幅的最佳方法吗?或者我可以在导航控制器中显示每个视图控制器的广告横幅视图吗?
谢谢
Apple 的 BannerView 示例应用程序似乎涵盖了这一点。它不是故事板应用程序,但应适用基本规则。有一个 VC 具有广告视图以及您的应用程序视图。
我在这里写了一篇博客post:http://www.notthepainter.com/iad-admob-integration-with-a-dynamic-uiview/
请注意,博客 post 是关于 iAd 和 ad mob 集成的,但应适用相同的概念。您根本不需要使用广告集成来完成此操作。你真的可以忽略这个答案的其余部分,看看 Apple 如何使用 BannerView 示例应用程序。
这是博客 posting:
已经发布了 2 个应用程序,都使用了 iAds。我使用 Apple 的 BannerView 示例代码来实现它。基本上,在您的委托中,您不会将 root 设置为您期望的根 UIViewController,而是将 root 设置为包含您的真实根的 BannerView。当 iAd 可用时,您的主视图会缩小并且 iAd 显示在底部。当广告不可用时,您的视图会扩展到其“正常”大小。
这在测试中非常有效,所以我将这两个应用程序都发布到了应用程序商店。然而,当我第一次从商店下载这些版本时,我很惊讶地发现没有广告。事实证明,至少现在,iAd 的填充率非常糟糕。所以我想在 iAd 不可用时展示另一个广告。
我在 GitHub 上找到了 larsacus 的开源项目 LARSAdController。除了一件事,他使广告整合变得非常容易。当你沿着他的快速发展路线走下去时,你会看到覆盖你视野的广告,它不会缩小以容纳广告。这是一个完全合理的设计决定,只是不是我想要的。
所以我决定修改Apple的BannerView来使用LARSAdController。很简单。
您要做的第一件事是从 BannerView 的 .h 文件中删除 iAd 并在 LARS TOLAdViewController class.
中删除广告
#import "TOLAdViewController.h"
#define KVO_AD_VISIBLE @"KVO_AD_VISIBLE"
@interface BannerViewController : TOLAdViewController
(暂时忽略 KVO_AD_VISIBLE 定义,我稍后会介绍。)在 .m 文件中也删除 iAd 并进行以下更改:
@implementation BannerViewController {
UIView *_bannerView;
UIViewController *_contentController;
BOOL isLoaded;
}
我们将 _bannerView 从 ADBannerView 更改为普通的旧 UIVIew。 ADBannerView 也有一个 bannerLoaded 属性,我们必须用我们的 isLoaded 布尔值替换它。 initWithContentViewController也很容易修改。
// IAPHelper *sharedInstance = [//IAPHelper sharedInstance];
//if ([sharedInstance showBannerAds]) {
if (YES) {
_bannerView = [[UIView alloc] initWithFrame:CGRectZero];
} else {
_bannerView = nil; // not showing ads since the user has upgraded
}
注意注释掉的部分。如果您使用应用内购买将广告支持版本转换为无广告版本,您可以在此处执行此操作。
在方法的最后,我们将使用键值观察 (KVO) 来观察 LARS 并查看广告何时投放或删除。 (我可能会在以后的博文中介绍 KVO。)
[[LARSAdController sharedManager] addObserver:self
forKeyPath:kLARSAdObserverKeyPathIsAdVisible
options:0
context:KVO_AD_VISIBLE]
以及观察代码:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context;
{
if(context == KVO_AD_VISIBLE) {
NSNumber *isVisible = [object valueForKey:kLARSAdObserverKeyPathIsAdVisible];
if ([isVisible boolValue]) {
_bannerView.frame = [[LARSAdController sharedManager] containerView].frame;
isLoaded = YES;
} else {
isLoaded = NO;
}
}
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
}
我们保存新广告的框架并更新 isLoaded 变量。 (最初认为我需要调用 setNeedsLayout 和 layoutIfNeeded 但实际上我没有。)viewDidLayoutSubviews 的 mods 也非常简单。唯一奇怪的部分是删除了对 ADBannerContentSizeIdentifierPortrait 和 ADBannerContentSizeIdentifierLandscape 的引用,并将其全部替换为一行:
bannerFrame.size = [_bannerView sizeThatFits:contentFrame.size];
几行之后您使用新的 isLoaded 变量
if (isLoaded) {
不要忘记在 dealloc 中清理你的观察者:
-(void) dealloc;
{
[[LARSAdController sharedManager] removeObserver:self forKeyPath:kLARSAdObserverKeyPathIsAdVisible];
}
剩下的就是在您的应用委托中告诉 LARS 您的广告:
[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapterGoogleAds class] withPublisherId:@"a14e55c99c24b43"];
[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapteriAds class]];
LARSBannerViewController *root = [[LARSBannerViewController alloc] initWithNibName:@"LARSBannerViewController" bundle:nil];
_bannerViewController = [[BannerViewController alloc] initWithContentViewController:root];
[self.window setRootViewController:_bannerViewController];
就是这样。现在您的应用应该会显示 iAD 或 AdMob 广告,并且您的视图会缩小以适应它们。
当然有一个错误,我不知道这是在 AdMob 服务器中还是在 LARS 中,但是当您在 iPhone 上处于横向模式时,广告的大小和报告的大小不同留下屏幕底部的黑条。我已经 ping larsacus 关于它,并会在我知道更多时更新此 post。
**试试这个:**
let arrViews = NSMutableArray()
arrViews.add(self.viewEmail)
arrViews.add(self.viewEventTime)
arrViews.add(self.viewLocation)
for vc in arrViews
{
let vc1 = vc as! UIView
vc1.layer.masksToBounds = false
vc1.layer.shadowOffset = CGSize(width: 2.5, height: 2.5)
vc1.layer.shadowRadius = 5
vc1.layer.shadowOpacity = 0.5
}
我像 2 年前一样使用故事板构建了一个应用程序。应用程序的根视图控制器是 UINavigation 控制器,根视图控制器根据用户交互加载视图控制器。从根视图控制器,根据用户操作,可以在 UINavigation 中显示 8 个其他视图控制器。
现在我想将横幅广告添加到那个 app.The 问题是因为我最初是使用故事板和视图控制器实现应用程序的,所以我想知道在哪里添加横幅广告的代码。
我做了一些研究,看起来可能的选择是 1. 添加一个 UIViewcontroller 作为根视图控制器 2.在UIViewcontroller中添加一个ContainerView 3.从容器视图中将Exiting navigation controller设为嵌入式segue 4.添加广告横幅(想要屏幕底部的广告横幅)。
换句话说
现有
--> UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController-->
计划修改
--> UIViewController-->(has)-->Containerview-->(embed segue)-->UINavigationController-->(segue)-->LoginController-->(segue)-->MainpageController -->
我想知道的是,在我的案例中,这是实施广告横幅的最佳方法吗?或者我可以在导航控制器中显示每个视图控制器的广告横幅视图吗?
谢谢
Apple 的 BannerView 示例应用程序似乎涵盖了这一点。它不是故事板应用程序,但应适用基本规则。有一个 VC 具有广告视图以及您的应用程序视图。
我在这里写了一篇博客post:http://www.notthepainter.com/iad-admob-integration-with-a-dynamic-uiview/
请注意,博客 post 是关于 iAd 和 ad mob 集成的,但应适用相同的概念。您根本不需要使用广告集成来完成此操作。你真的可以忽略这个答案的其余部分,看看 Apple 如何使用 BannerView 示例应用程序。
这是博客 posting:
已经发布了 2 个应用程序,都使用了 iAds。我使用 Apple 的 BannerView 示例代码来实现它。基本上,在您的委托中,您不会将 root 设置为您期望的根 UIViewController,而是将 root 设置为包含您的真实根的 BannerView。当 iAd 可用时,您的主视图会缩小并且 iAd 显示在底部。当广告不可用时,您的视图会扩展到其“正常”大小。
这在测试中非常有效,所以我将这两个应用程序都发布到了应用程序商店。然而,当我第一次从商店下载这些版本时,我很惊讶地发现没有广告。事实证明,至少现在,iAd 的填充率非常糟糕。所以我想在 iAd 不可用时展示另一个广告。
我在 GitHub 上找到了 larsacus 的开源项目 LARSAdController。除了一件事,他使广告整合变得非常容易。当你沿着他的快速发展路线走下去时,你会看到覆盖你视野的广告,它不会缩小以容纳广告。这是一个完全合理的设计决定,只是不是我想要的。
所以我决定修改Apple的BannerView来使用LARSAdController。很简单。
您要做的第一件事是从 BannerView 的 .h 文件中删除 iAd 并在 LARS TOLAdViewController class.
中删除广告#import "TOLAdViewController.h"
#define KVO_AD_VISIBLE @"KVO_AD_VISIBLE"
@interface BannerViewController : TOLAdViewController
(暂时忽略 KVO_AD_VISIBLE 定义,我稍后会介绍。)在 .m 文件中也删除 iAd 并进行以下更改:
@implementation BannerViewController {
UIView *_bannerView;
UIViewController *_contentController;
BOOL isLoaded;
}
我们将 _bannerView 从 ADBannerView 更改为普通的旧 UIVIew。 ADBannerView 也有一个 bannerLoaded 属性,我们必须用我们的 isLoaded 布尔值替换它。 initWithContentViewController也很容易修改。
// IAPHelper *sharedInstance = [//IAPHelper sharedInstance];
//if ([sharedInstance showBannerAds]) {
if (YES) {
_bannerView = [[UIView alloc] initWithFrame:CGRectZero];
} else {
_bannerView = nil; // not showing ads since the user has upgraded
}
注意注释掉的部分。如果您使用应用内购买将广告支持版本转换为无广告版本,您可以在此处执行此操作。
在方法的最后,我们将使用键值观察 (KVO) 来观察 LARS 并查看广告何时投放或删除。 (我可能会在以后的博文中介绍 KVO。)
[[LARSAdController sharedManager] addObserver:self
forKeyPath:kLARSAdObserverKeyPathIsAdVisible
options:0
context:KVO_AD_VISIBLE]
以及观察代码:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context;
{
if(context == KVO_AD_VISIBLE) {
NSNumber *isVisible = [object valueForKey:kLARSAdObserverKeyPathIsAdVisible];
if ([isVisible boolValue]) {
_bannerView.frame = [[LARSAdController sharedManager] containerView].frame;
isLoaded = YES;
} else {
isLoaded = NO;
}
}
[self.view setNeedsLayout];
[self.view layoutIfNeeded];
}
我们保存新广告的框架并更新 isLoaded 变量。 (最初认为我需要调用 setNeedsLayout 和 layoutIfNeeded 但实际上我没有。)viewDidLayoutSubviews 的 mods 也非常简单。唯一奇怪的部分是删除了对 ADBannerContentSizeIdentifierPortrait 和 ADBannerContentSizeIdentifierLandscape 的引用,并将其全部替换为一行:
bannerFrame.size = [_bannerView sizeThatFits:contentFrame.size];
几行之后您使用新的 isLoaded 变量
if (isLoaded) {
不要忘记在 dealloc 中清理你的观察者:
-(void) dealloc;
{
[[LARSAdController sharedManager] removeObserver:self forKeyPath:kLARSAdObserverKeyPathIsAdVisible];
}
剩下的就是在您的应用委托中告诉 LARS 您的广告:
[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapterGoogleAds class] withPublisherId:@"a14e55c99c24b43"];
[[LARSAdController sharedManager] registerAdClass:[TOLAdAdapteriAds class]];
LARSBannerViewController *root = [[LARSBannerViewController alloc] initWithNibName:@"LARSBannerViewController" bundle:nil];
_bannerViewController = [[BannerViewController alloc] initWithContentViewController:root];
[self.window setRootViewController:_bannerViewController];
就是这样。现在您的应用应该会显示 iAD 或 AdMob 广告,并且您的视图会缩小以适应它们。
当然有一个错误,我不知道这是在 AdMob 服务器中还是在 LARS 中,但是当您在 iPhone 上处于横向模式时,广告的大小和报告的大小不同留下屏幕底部的黑条。我已经 ping larsacus 关于它,并会在我知道更多时更新此 post。
**试试这个:**
let arrViews = NSMutableArray()
arrViews.add(self.viewEmail)
arrViews.add(self.viewEventTime)
arrViews.add(self.viewLocation)
for vc in arrViews
{
let vc1 = vc as! UIView
vc1.layer.masksToBounds = false
vc1.layer.shadowOffset = CGSize(width: 2.5, height: 2.5)
vc1.layer.shadowRadius = 5
vc1.layer.shadowOpacity = 0.5
}