глобальный ADBannerView в приложении для iPhone - PullRequest
11 голосов
/ 08 сентября 2010

Возможно ли в стандартном приложении с корнем UINavigationController иметь один ADBannerView, видимый в нижней части экрана, под иерархией представления? То есть, не изменяя каждый view-controller / view, который может быть передан в корневой UINavigationController, я могу иметь глобальный ADBannerView видимым?

Я не уверен, как это настроить, в IB или в коде. Помощь

Я вижу похожие вопросы с неопределенными ответами. Я ищу конкретный пример.

Ответы [ 4 ]

10 голосов
/ 09 сентября 2010

РЕДАКТИРОВАТЬ: лучший способ сделать это в iOS5 +, вероятно, использовать сдерживание контроллера представления. То есть создайте корневой контроллер, содержащий вашу рекламу и контроллер приложения (nav, tab и т. Д.).

Я нашел способ сделать это. Вот что я сделал:

Для моей первой попытки я создал новый контроллер представления под названием AdBannerController. Для его просмотра я создал полноэкранный режим и два подпредставления. Первое подпредставление (contentView) предназначено для обычного контента, второе - AdBannerView. Я использовал экземпляр этого контроллера представления в качестве контроллера представления, связанного с окном приложения ([window addSubview: adBannerController.view]). Затем я добавил свой UINavigationController.view в качестве подпредставления adBannerController.view: [adBannerController.contentView addSubview: navigationController.view].

В основном это работало, за исключением того, что viewcontrollers, отправленные в UINavigationController, никогда не вызывали свои методы will / did-load / unload. Чепуха. В нескольких местах я читал, что это признак того, что представление UINavigationController не является прямым потомком окна приложения.

Для второй попытки я взял тот же AdBannerController и извлек его из UINavigationController. На этот раз я сделал следующее в loadView:

- (void)loadView
{
    [super loadView];

    _contentView = [self.view retain];

    self.view = [[[UIView alloc] initWithFrame: _contentView.frame] autorelease];

    [self.view addSubview: _contentView];

    _adView = [[ADBannerView alloc] initWithFrame: CGRectMake(0, _contentView.bounds.size.height, 320, 50)];
    _adView.currentContentSizeIdentifier = ADBannerContentSizeIdentifier320x50;
    _adView.delegate = self;

    [self.view addSubview: _adView]; 

    /* for visual debugging of view layout
    [[_mainView layer] setCornerRadius: 6.0];
    [[_mainView layer] setMasksToBounds: YES];
    [[_mainView layer] setBorderWidth: 1.5];
    [[_mainView layer] setBorderColor: [[UIColor grayColor] CGColor]];  
     */
}

Обратите внимание, что происходит - я позволил суперклассу UINavigationController создать свое обычное представление «контента», но я поменял его и заменил своим собственным представлением, которое является контейнером как для просмотра контента, так и для просмотра рекламы.

Это работает довольно хорошо. Я также использую Three20, и для этой работы требовалось несколько вещей, но не так уж плохо.

Надеюсь, это кому-нибудь поможет!

3 голосов
/ 24 января 2011

В образце кода разработчика Apple проекты проектов iAdSuite, которые сделали это для вас.Настоятельно рекомендуется.

2 голосов
/ 27 декабря 2011

В моем контроллере корневого представления (w / ADBannerViewDelegate) я настраиваю свой баннер, добавляя его в представление контроллера nav, которое постоянно держит его сверху:

banner = [[ADBannerView alloc] init];
banner.delegate = self;
banner.frame = CGRectMake(0.0, 430.0, banner.frame.size.width, banner.frame.size.height);
[self.navigationController.view addSubview:banner];

Обратите внимание, что вам необходимо закомментировать layoutAnimated в методе делегата bannerViewDidLoadAd, так как он попытается переместить просмотр объявления вверх:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    //[self layoutAnimated:YES];
}
0 голосов
/ 22 июня 2013

Я адаптировал подход, предложенный в iAdSuite, приведенном здесь

http://developer.apple.com/library/ios/#samplecode/iAdSuite/Introduction/Intro.html

Я скачал код и сосредоточился на примере с «вкладками». Я скопировал файл BannerViewController.h / .m как есть в мой проект.

Я создал все свои представления обычным способом с использованием раскадровки. Однако в моем классе AppDelegate я получил доступ к уже созданной панели вкладок, содержащей все встроенные viewControllers раскадровки.

Класс AppDelegate реализует протокол TabBarControllerDelegate:

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate>

Реализация метода AppDelegate didFinishLaunchingWithOptions захватывает предварительно созданный tabBar, устанавливая его делегата на себя (например, класс AppDelegate).

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
// ----------------------------------------------------------
// Set the TabBarController delegate to be 'self'
// ----------------------------------------------------------
_tabBarController = (UITabBarController*)self.window.rootViewController;

//  tabController.selectedIndex = [defaults integerForKey:kOptionLastTabSelectedKey];
_tabBarController.delegate = self;

// update tab bar per iAdSuite approach
[self updateiAd];

Затем я создал новый набор контроллеров для подхода iAdSuite и сбросил панель вкладок с помощью этих новых элементов панели вкладок.

-(void)updateiAd {
NSArray* viewControllers = [_tabBarController viewControllers];
NSMutableArray*newViewControllers = [[NSMutableArray alloc] init];
BannerViewController*bvc=NULL;
for(UIViewController * vc in viewControllers) {
    bvc = [[BannerViewController alloc] initWithContentViewController:vc];
    [newViewControllers addObject:bvc];
}

// set the new view controllers, replacing the original set
[_tabBarController setViewControllers:newViewControllers];
}

Этот подход помещает одно и то же «объявление» внизу каждого представления, точно так, как необходимо. Я также должен был установить заголовок представления в методе viewDidLoad каждого настраиваемого viewController (каким-то образом установка его на элемент панели, похоже, не сработала, но и не установила изображение; однако позднее это может отражать проблему с моими изображениями). 1019 *

Моя первоначальная конфигурация была

                           TabViewController

NavController1               NavController2          NavController3  ...
      |                            |                       |
CustomViewController1      CustomViewController2      CustomViewController3

Моя окончательная конфигурация теперь

                           TabViewController

NavController1               NavController2          NavController3  ...
     |                            |                       |
iAdView1                         iAdView2               iAdView3
    |                            |                       |
CustomViewController1      CustomViewController2      CustomViewController3

С точки зрения жизненного цикла представления я должен добавить, что на момент вызова метода updateiAd существуют только NavController.

Отдельные CustomViewControllers1 / 2/3 / и т. Д. Создаются после завершения вызова.

...