web-dev-qa-db-ja.com

CGAffineTransformInvert:特異行列エラー

Xcodeでユニバーサルアプリ(シングルビュー)を作成しました。すべてのビューにiAdバナーを配置したいので、このコードをAppDelegateファイルに追加しました。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
{
    if var root = self.window?.rootViewController
    {
        let contentFrame = UIScreen.mainScreen().bounds
         var _banner = ADBannerView(adType: ADAdType.Banner)

        _banner.frame=CGRectMake(0, contentFrame.height - _banner.frame.height, _banner.frame.width, _banner.frame.height)
        _banner.delegate = self
        root.view.addSubview(_banner)
    }

    return true
}

実際のiPhone(iOS 8)では、すべてが正常に機能します(バナーはすべてのビューに表示されます)が、次のエラーが発生します。

<Error>: CGAffineTransformInvert: singular matrix.

このアプリをシミュレーター(iOS 8)で実行しようとすると、動作は同じです。すべて正常に動作し、同じエラーが発生しますが、さらに次のようになります。* ADBannerView:

 Unhandled error (no delegate or delegate does not implement didFailToReceiveAdWithError:):
 Error Domain=ADErrorDomain Code=7 "The operation couldn’t be completed. Ad was unloaded from 
this banner" UserInfo=0x7b83bf30 {ADInternalErrorCode=7, ADInternalErrorDomain=ADErrorDomain, 
NSLocalizedFailureReason=Ad was unloaded from this banner}*

しかし、私には委任があり、didFailToReceiveAdWithErrorを実装しました。実際のiPhoneでは動作します...

私の質問は、これら2つの特定のエラーをどのように解決できるかということです。

11
André

最も可能性の高い原因は、ここの四角形の1つがゼロであるということです。ゼロ行列を反転することはできません(これは技術的な詳細であり、実際に気にする必要はありません。私は、なぜそれがエラーになるのかを説明しようとしています)。

application(didFinishLaunchingWithOptions:)は非常に早く呼び出され、フレームはおそらくまだ設定されていません。ルートビューコントローラーのviewDidLoad(必要に応じてviewWillAppearのフレームを修正する可能性があります)でこの作業を行いたいと思うかもしれません(おそらくそのためのサブクラスを作成する必要がありますまだ持っていません)。

11
Rob Napier

これをviewControllerクラスに追加します。adBannerをバナープロパティ名に置き換えます。

-(void)viewDidDisappear:(BOOL)animated{
    [adBanner removeFromSuperview];
    adBanner.delegate = nil;
    adBanner = nil;
}
0
4GetFullOf