Глобальный ADBannerView в приложении iPhone
Возможно ли с помощью стандартного приложения, управляемого UINavigationController, иметь один вид ADBannerView, видимый внизу экрана под иерархией представлений? То есть, не изменяя каждый view-controller/view, который может быть перенесен в корневой UINavigationController, можно ли увидеть глобальный ADBannerView?
Я не уверен, как установить это, либо в IB, либо в коде. Помощь?
Я вижу похожие вопросы с неопределенными ответами. Я ищу конкретный пример.
Ответы
Ответ 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 создаются после завершения вызова.