2010-09-08 3 views
11

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

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

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

ответ

10

EDIT: лучший способ сделать это в iOS5 +, скорее всего, будет использовать локатор контроллера. То есть, создайте корневой контроллер, который содержит ваш рекламный и прикладной контроллер (nav, tab и т. Д.).

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

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

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

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

+0

Очень полезно, я пытаюсь это сейчас. – bentford

+1

Я реализовал что-то подобное, но имел трудности во взглядах, где я использую UISearchBar как tableViewHeader, так же как и в представлениях, где navBar прозрачен – coneybeare

+0

Это действительно работает –

3

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

+1

Да, но это не делает то, что просит ОП - вместо этого объявление в образце Apple переходит в подзоны, и обратно, когда вы используете кнопку «Назад». –

+0

Конечно, если контроллер представления, который управляет рекламой, помещается в стек и впоследствии удаляется. Я бы заменил контроллер представления, который делегат и окно приложения используют с объявлением управлять r, затем добавьте иерархию представлений. – JoePasq

2

В моем корневом контроллере представления (ж/ADBannerViewDelegate) Настройка I моего баннер, добавив его в представление контроллера нав, который держит его на вершине во все времена:

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

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

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

Я загрузил код и сфокусировался на примере «табуляции».Я скопировал файл BannerViewController.h/.m, как в мой проект.

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

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

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate> 

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

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

      TabViewController 

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

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

      TabViewController 

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

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

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

Смежные вопросы