2

最近、会社のモバイル アプリに統合するためのプライベート ハードウェア SDK を受け取りました。一部の不透明なメソッド呼び出しの結果としてa を使用していることを除いて、すべてがうまく機能しUIAlertView、私の設計チームはこれをブランド化したいと考えています。SDK のソース コードにアクセスできません。UIAlertViewすべての機能を保持UIAlertViewし、アプリの外観とよりブランド化/一貫性を持たせるために外観を変更するだけで安全にスウィズルできる方法はありますか? もしそうなら、私はオーバーロードdrawRectするか、何か他のものを使いますか? また、ラベルの名前が何であるかを調べて、必要なUIAlertViewサイズ、形、色でラベルを描画できるようにするにはどうすればよいでしょうか?

追加の詳細については、アプリは現在使用していません。理論的には、スウィズリングは、このクローズド ソース SDK で何が起こっているかにのみ影響しますUIAlertViewUIAlertViewController

4

1 に答える 1

3

それはまったく簡単なことではありません。


SDK が を使用している場合は、メソッドを入れ替えUIAlertViewてみてください。show

実装では、おおよそ次のことを行う必要があります。

1) 元の UIAlertView を表示させないでください。カスタマイズするのは非常に困難です。

2).delegate必要なときに通知できるように古い参照を保持します。

3) 独自のカスタム UIView を作成して使用します[[UIApplication sharedApplication].keyWindow addSubview:myCustomAlertView];

4) 次のようなプロパティを使用して、以前の UIAlertView 変数 (つまり、ボタンのタイトル、textFields など) をすべて取得できると思います。

@property(nonatomic,copy) NSString *title;
@property(nullable,nonatomic,copy) NSString *message;
- (nullable NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex;
@property(nonatomic,readonly) NSInteger numberOfButtons;
@property(nonatomic) NSInteger cancelButtonIndex;

5) 独自のデザインを作成し、必要に応じて対応するデリゲート メソッドを呼び出します。


別のアプローチとして、Apple のプライベート API を使用する方法がありますが、これは悪い結果につながる可能性があります。

これは非常にハッキーなアプローチです。まず、それが機能するという保証はありません。次に、アプリが拒否される可能性があります。なので、あまりオススメしません…

ただし、このアプローチを本当に使用したい場合は、次のことを試してください。

しばらく[myAlertView show];してからプロパティを確認します (つまり、0.01 秒で十分です)。

ここに画像の説明を入力

次に、UI 関連の情報が含まれている可能性のある疑わしいプロパティ (おそらく UIView クラス) を探します。たとえば、__representer非常に興味深いものに見えます。これには制約があり、labelContainerView... これらのプロパティを試してみてください。

それを取得するには__representer、KVC と KVO を使用します (つまり、 から始めid theAlertController = [myAlertView valueForKey:@"_alertController"];ます)。そして、どんどん深く潜っていきます。

うまくいけば、有用なプロパティを見つけて、KVC を介してそれらの値を変更できるようになるでしょう。

于 2016-02-01T19:21:33.030 に答える