Подтвердить что ты не робот

Глобальный ADBannerView в приложении iPhone

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

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

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

4b9b3361

Ответ 1

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

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

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

Это в основном работало, за исключением того, что диспетчер просмотра, нажатый в UINavigationController, никогда не получал вызванные им вызовы/команды загрузки/выгрузки. Чепуха. Я читал в нескольких местах, что это признак представления 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 создавать его регулярное представление "контент", но я заменяю его и заменяю его своим собственным представлением, которое является контейнером как для содержимого, так и для объявлений.

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

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

Ответ 2

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

Ответ 3

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

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];
}

Ответ 4

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

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

Я загрузил код и сфокусировался на примере "tab". Я скопировал файл 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 и reset панель вкладок с этими новыми элементами панели вкладок.

-(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 (каким-то образом установка его на элемент панели, похоже, не работала, не устанавливала изображение, но позже может отражать проблему с моими изображениями).

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

                           TabViewController

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

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

                           TabViewController

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

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

Индивидуальные CustomViewControllers1/2/3/etc создаются после завершения вызова.