Взаимодействие iAd на iPad портит интерфейс - PullRequest
0 голосов
/ 05 августа 2011

Эй, ребята,

Я реализовал iAd через AdWhirl в своем недавнем приложении для iPad, в котором мне нужно вручную настроить интерфейс для событий поворота. Когда мое приложение находится в альбомной ориентации и пользователь нажимает на объявление, интерфейс вынужден переходить в портретный режим. Это нормально, пока приложение закрывается, потому что строка состояния, кажется, повернута, но интерфейс странным образом не получил никаких уведомлений для поворота, поэтому все (что на самом деле означает все!) Вроде как испорчено. Любые предложения, что вызывает это странное поведение? Большое спасибо, Тим

1 Ответ

0 голосов
/ 29 июля 2012

У меня точно такая же проблема, подумал, может быть, это проблема MonoTouch. Будет приятно посмотреть, если кто-нибудь знает, почему это так. Я пытался заставить его повернуть назад, но мне не повезло.

Пока я собираюсь выпустить свое приложение, назовите это известной ошибкой.

EDIT: Вот тестовый ViewController, который я использовал в MonoTouch.

using System;
using MonoTouch.iAd;
using MonoTouch.UIKit;
using MonoTouch.Foundation;


namespace ADBannerRotate
{
    public class ViewController : UIViewController
    {

        private ADBannerView adBannerView = null;

        public ViewController()
        {
        }

        public override void ViewDidLayoutSubviews()
        {
            base.ViewDidLayoutSubviews();
            Console.WriteLine("ViewDidLayoutSubviews");


            Console.WriteLine("ViewDidLayoutSubviews StatusBarOrientation: " + UIApplication.SharedApplication.StatusBarOrientation);
            Console.WriteLine("ViewDidLayoutSubviews Orientation: " + UIDevice.CurrentDevice.Orientation);

        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            Console.WriteLine("ViewDidLoad");


            adBannerView = new ADBannerView();
            adBannerView.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;


            NSMutableSet requiredContentSizeIdentifiers = new NSMutableSet(); 
            requiredContentSizeIdentifiers.Add(ADBannerView.SizeIdentifierPortrait);
            requiredContentSizeIdentifiers.Add(ADBannerView.SizeIdentifierLandscape); 
            adBannerView.RequiredContentSizeIdentifiers = requiredContentSizeIdentifiers;

            if (UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeLeft || UIApplication.SharedApplication.StatusBarOrientation == UIInterfaceOrientation.LandscapeRight)
            {
                adBannerView.CurrentContentSizeIdentifier = ADBannerView.SizeIdentifierLandscape;
            }
            else 
            {
                adBannerView.CurrentContentSizeIdentifier = ADBannerView.SizeIdentifierPortrait;
            }

            adBannerView.ActionFinished += delegate(object sender, EventArgs e) {
                Console.WriteLine("ActionFinished");

                Console.WriteLine("ActionFinished StatusBarOrientation: " + UIApplication.SharedApplication.StatusBarOrientation);
                Console.WriteLine("ActionFinished Orientation: " + UIDevice.CurrentDevice.Orientation);

            };
            adBannerView.AdLoaded += delegate(object sender, EventArgs e) {
                Console.WriteLine("AdLoaded - " + adBannerView.CurrentContentSizeIdentifier);
            };
            adBannerView.FailedToReceiveAd += delegate(object sender, AdErrorEventArgs e) {
                Console.WriteLine("FailedToReceiveAd");
            };
            adBannerView.WillLoad += delegate(object sender, EventArgs e) {
                Console.WriteLine("WillLoad");
            };

            View.AddSubview(adBannerView);
        }

        public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation)
        {
            Console.WriteLine("ShouldAutorotateToInterfaceOrientation - " + toInterfaceOrientation);
            Console.WriteLine("ShouldAutorotateToInterfaceOrientation StatusBarOrientation: " + UIApplication.SharedApplication.StatusBarOrientation);
            Console.WriteLine("ShouldAutorotateToInterfaceOrientation Orientation: " + UIDevice.CurrentDevice.Orientation);


            if (adBannerView != null)
            {
                if (toInterfaceOrientation == UIInterfaceOrientation.LandscapeLeft || toInterfaceOrientation == UIInterfaceOrientation.LandscapeRight)
                {
                    adBannerView.CurrentContentSizeIdentifier = ADBannerView.SizeIdentifierLandscape;
                }
                else
                {
                    adBannerView.CurrentContentSizeIdentifier = ADBannerView.SizeIdentifierPortrait;
                }
            }
            return true;
        }
    }
}

Одна забавная вещь, с которой я столкнулся, заключается в том, что на iPad (3-го поколения) 3 раза вызывается ShouldAutorotateToInterfaceOrientation, затем ViewDidLayoutSubviews, затем ActionFinished, но на iPhone (3GS) должен вызываться один раз должен быть IfAutorotateToInterfaceOrientation, а один раз вызывается ActionFinished.

Также на iPad, если я блокирую поворот вида в альбомной ориентации, затем поднимаю рекламу, затем отклоняю ее, она меняет ее на портретную для меня.

...