2010-09-08 11 views
11

Czy jest to możliwe ze standardową aplikacją UINavigationController, aby mieć jedną ADBannerView widoczną u dołu ekranu, poniżej hierarchii widoku? To znaczy, bez modyfikowania każdego kontrolera widoku/widoku, który można przekazać do głównego kontrolera UINavigationController, czy mogę mieć globalny ADBannerView, który będzie widoczny?globalny ADBannerView w aplikacji na iPhone'a

Nie jestem pewien, jak to ustawić, albo w IB lub w kodzie. Wsparcie?

Widzę podobne pytania z niejasnymi odpowiedziami. Szukam konkretnego przykładu.

Odpowiedz

10

EDYCJA: Lepszym sposobem na wykonanie tej czynności w iOS5 + może być użycie kontrolera kontrolera widoku. Oznacza to, że należy utworzyć kontroler główny, który zawiera reklamę i kontroler aplikacji (nawigacja, karta itd.).

Wymyśliłem sposób, aby to zrobić. Oto co zrobiłem:

Dla mojej pierwszej próby stworzyłem nowy kontroler widoku o nazwie AdBannerController. Dla jego widoku stworzyłem widok pełnoekranowy i dwa subviews. Pierwszy subview (contentView) przeznaczony jest dla zwykłej zawartości, a drugi to AdBannerView. Użyłem instancji tego kontrolera widoku jako kontrolera widoku powiązanego z oknem aplikacji ([window addSubview: adBannerController.view]). Następnie dodałem mój UINavigationController.view jako podzbiór adBannerController.view: [adBannerController.contentView addSubview: navigationController.view].

Przeważnie działało, z tą różnicą, że kontrolery views przekazywane do panelu UINavigationController nigdy nie wywoływały wywoływanych przez nich metod testowania/ładowania/rozładowywania. Shucks. Czytam w kilku miejscach, że jest to objawem widoku UINavigationController nie będąc bezpośrednim potomkiem okna aplikacji.

Dla mojej drugiej próby wziąłem ten sam AdBannerController i wyprowadziłem go z UINavigationController. Tym razem zrobiłem następujące w 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]]; 
    */ 
} 

zauważyć, co się dzieje - I niech nadklasą UINavigationController skonstruować swój regularny „content” widok, ale zamienić go i zastąpić go moim zdaniem co jest pojemnik zarówno w widoku treści, jak i reklam.

To działa całkiem dobrze. Używam również three20 i było kilka rzeczy, które wymagały by to działało z tą konfiguracją, ale niezbyt dobrze.

Mam nadzieję, że to pomoże komuś!

+0

Bardzo pomocna, próbuję teraz. – bentford

+1

Zaimplementowałem coś takiego, ale miałem trudności w widokach, w których używam UISearchBar jako tableViewHeader, a także w widokach, gdzie navBar jest przezroczysty. – coneybeare

+0

To faktycznie wydaje się działać –

3

W przykładowym kodzie deweloperów Apple projekty zawartości projektu iAdSuite wykonują to za Ciebie. Wysoce polecany.

+1

Tak, ale nie robi to, o co prosi OP - zamiast tego reklama w przykładowych slajdach Apple'a z subviewsami, i wycofaj się ponownie, gdy użyjesz przycisku "Wstecz" –

+0

Oczywiście, jeśli kontroler widoku, który zarządza reklamami, jest wypychany na stos, a następnie usuwany. Zastąpiłbym kontroler widoku, który aplikacja deleguje i używa w oknie z reklamą. zarządzanie r, a następnie dodaj do tego hierarchię widoków. – JoePasq

2

Moim głównym widoku kontrolera (w/ADBannerViewDelegate) Instalatora mój banner, dodając je do widoku kontrolera nav, który utrzymuje ją na szczycie w każdej chwili:

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

Uwaga trzeba będzie wypowiedzieć się layoutAnimated w metodzie delegat bannerViewDidLoadAd jak będzie starał się przesunąć widok reklam up:

- (void)bannerViewDidLoadAd:(ADBannerView *)banner 
{ 
    //[self layoutAnimated:YES]; 
} 
0

I dostosowany podejście sugerowane w iAdSuite podane tutaj

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

Pobrałem kod i skoncentrowałem się na przykładzie "tabulacji".Skopiowałem przez BannerViewController.h/.m jak do mojego projektu.

Wszystkie moje poglądy stworzyłem w zwykły sposób, stosując podejście storyboard. Jednak w mojej klasie AppDelegate uzyskałem dostęp do już zbudowanego paska kart - zawierającego wszystkie storyboard zbudowany viewControllers.

Klasa AppDelegate realizuje protokół TabBarControllerDelegate:

@interfaceAppDelegate : UIResponder <UITabBarControllerDelegate, UIApplicationDelegate> 

AppDelegate didFinishLaunchingWithOptions realizacji sposób chwyta wstępnie utworzony umieszczenie zakładek, ustawiając jego pełnomocnika do siebie (na przykład klasy 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]; 

Następnie zbudowałem nowy zestaw kontrolerów zgodnie z podejściem iAdSuite i zresetowałem pasek kart z tymi nowymi elementami paska kart.

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

To podejście umieszcza tę samą "reklamę" u dołu każdego widoku, dokładnie w razie potrzeby. Musiałem również ustawić tytuł widoku w metodzie viewDidLoad każdego niestandardowego viewController (jakoś ustawienie go na pasku nie wydawało się działać, nie ustawiłem obrazu, później może to odzwierciedlać problem z moimi obrazami jednak).

Moja oryginalna konfiguracja została

      TabViewController 

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

Moja ostatnia konfiguracja jest teraz

      TabViewController 

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

Pod względem widzenia cyklu, należy dodać, że tylko NavControllers są w istnienie w czasie metoda updateiAd jest nazywa.

Poszczególne kontrolery CustomViewControllers1/2/3/etc zostaną utworzone po zakończeniu połączenia.