Высота кадра AdBannerView всегда равна нулю - PullRequest
0 голосов
/ 14 марта 2011

Я разрабатываю приложение для iPhone , которое должно иметь поддержку iAds . Приложение имеет основной вид с html-содержимым, и при загрузке iAd оно должно изменить размер основного вида, чтобы объявление показывалось внизу. Все в порядке и работает, за исключением того факта, что , когда я выполняю вычисления для вычисления новых прямоугольников как основного вида, так и баннера iAd, я всегда получаю 0 в качестве высоты рамки баннера . Я использую хардкор 50 в качестве этого значения, так как я буду использовать только портретное позиционирование, но я предпочел бы использовать подход со свойствами, если когда-нибудь изменится высота iAd. Вот код класса, где я делаю всю связанную работу (математика выполняется в методе __show):

//
//  SAiOSAdPlugin.m
//  Ad Plugin for PhoneGap
//
//  Created by shazron on 10-07-12.
//  Copyright 2010 Shazron Abdullah. All rights reserved.
//

#import "SAiOSAdPlugin.h"

@interface SAiOSAdPlugin(PrivateMethods)

- (void) __prepare:(BOOL)atBottom;
- (void) __showAd:(BOOL)show;

@end


@implementation SAiOSAdPlugin

@synthesize adView;
@synthesize bannerIsVisible, bannerIsInitialized, bannerIsAtBottom;

const int AdHeight = 50;

#pragma mark -
#pragma mark Public Methods

- (void) prepare:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
    NSUInteger argc = [arguments count];
    if (argc > 1) {
        return;
    }

    NSString* atBottomValue = [arguments objectAtIndex:0];
    [self __prepare:[atBottomValue boolValue]];
}

- (void) showAd:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options
{
    NSUInteger argc = [arguments count];
    if (argc > 1) {
        return;
    }

    NSString* showValue = [arguments objectAtIndex:0];
    [self __showAd:[showValue boolValue]];
}

#pragma mark -
#pragma mark Private Methods

- (void) __prepare:(BOOL)atBottom
{
    NSLog(@"SAiOSAdPlugin Prepare Ad At Bottom: %d", atBottom);

    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass && !self.adView)
    {
        self.adView = [[ADBannerView alloc] initWithFrame:CGRectZero];
        self.adView.requiredContentSizeIdentifiers = [NSSet setWithObjects: ADBannerContentSizeIdentifierPortrait, ADBannerContentSizeIdentifierLandscape, nil];        
        self.adView.delegate = self;
    }

    if (atBottom)
    {
        self.bannerIsAtBottom = YES;
    }

    self.bannerIsVisible = NO;
    self.bannerIsInitialized = YES;
}

- (void) __showAd:(BOOL)show
{
    NSLog(@"SAiOSAdPlugin Show Ad: %d", show);

    if (!self.bannerIsInitialized){
        [self __prepare:NO];
    }

    if (!(NSClassFromString(@"ADBannerView") && self.adView)) { // ad classes not available
        return;
    }

    if (show == self.bannerIsVisible) { // same state, nothing to do
        return;
    }

    CGRect adViewFrame = self.adView.frame;
    CGRect webViewFrame = [super webView].frame;
    CGFloat statusBarHeight = [UIApplication sharedApplication].statusBarFrame.size.height;

    if (self.bannerIsAtBottom) 
    {
        CGRect adViewFrame = self.adView.frame;
        printf("AdView Show: StatusBarHeight: %f, adViewFrameHeight: %f\n", statusBarHeight, adViewFrame.size.height);
        adViewFrame.origin.y = [UIScreen mainScreen].bounds.size.height - statusBarHeight - adViewFrame.size.height;
        printf("AdView origin Y: %f\n", adViewFrame.origin.y);
        self.adView.frame = adViewFrame;
    }   


    if (show)
    {
        if (self.bannerIsAtBottom)
        {
            webViewFrame.size.height -= (adViewFrame.size.height + statusBarHeight);
        }
        else
        {
            webViewFrame.origin.y += adViewFrame.size.height;
            webViewFrame.size.height -= (adViewFrame.size.height + statusBarHeight);
        }

        [UIView beginAnimations:@"blah" context:NULL];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        [super webView].frame = webViewFrame;
        [[[super webView] superview] addSubview:self.adView];

        printf("AdView on show: %f, %f\n", self.adView.frame.origin.x, self.adView.frame.origin.y);

        [UIView commitAnimations];

        self.bannerIsVisible = YES;
    }
    else 
    {
        if (self.bannerIsAtBottom)
        {
            webViewFrame.size.height += (adViewFrame.size.height + statusBarHeight);
        }
        else
        {
            webViewFrame.origin.y -= adViewFrame.size.height;
            webViewFrame.size.height += (adViewFrame.size.height + statusBarHeight);
        }

        [UIView beginAnimations:@"blah" context:NULL];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

        [super webView].frame = webViewFrame;
        [self.adView removeFromSuperview];

        [UIView commitAnimations];

        self.bannerIsVisible = NO;
    }

}

#pragma mark -
#pragma ADBannerViewDelegate

- (void)bannerViewDidLoadAd:(ADBannerView *)banner
{
    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass)
    {
        NSString* jsString = 
                @"var e = document.createEvent('Events');"
                "e.initEvent('iAdBannerViewDidLoadAdEvent');"
                "document.dispatchEvent(e);";
        [super writeJavascript:jsString];
    }
}

- (void)bannerView:(ADBannerView *)banner didFailToReceiveAdWithError:(NSError *)error
{
    Class adBannerViewClass = NSClassFromString(@"ADBannerView");
    if (adBannerViewClass)
    {
        NSString* jsString = 
        @"var e = document.createEvent('Events');"
        "e.initEvent('didFailToReceiveAdWithError');"
        "document.dispatchEvent(e);";
        [super writeJavascript:jsString];
    }
}

@end

Для записи я использую iOS 4.3 SDK и тестирую его на эмуляторе.

1 Ответ

2 голосов
/ 14 марта 2011

возможно, это поможет

"Если вашему приложению требуется точный размер рекламы для использования во время выполнения, он вызывает метод sizeFromBannerContentSizeIdentifier: класс, передавая либо ADBannerContentSizeIdentifierLandscape, либо ADBannerContentSizeIdentifierPortrait."

источник - http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/iAd_Guide/BannerAdvertisements/BannerAdvertisements.html#//apple_ref/doc/uid/TP40009881-CH3-SW2

...