no-image

THEOS #コードの書き方

なぜこの内容か

全然解説してくれている記事がないから。
おそらく、theosユーザさんはobjective-cを履修済みの方が多いのだろうが、えむいーさんはswift世代なので全然わからないのである。
よって、どういう書き方をすればtheosがちゃんと動くのかわからない。
この記事ではtheosが必要とされるであろう場面で、どのようなコードを書けばそれが実現可能かどうかをメモしていくものである。

広告非表示

最もやりたいことがこれである。もちろん、広告全てを消そうというつもりは毛頭ない。
料金を支払うことで広告が消せるのであれば、料金を払うつもりである。何も広告によるビジネスモデルが悪だから、そのモデルを潰してしまおうというつもりは全くない。そのビジネスモデルが嫌いだから自分では使わないというだけである。
よって、「無料で使うけれども広告は表示させない」というようなことはしない。
ただ、中には有料ユーザになりたいにも関わらずそのようなプランがなく、広告が強制的に表示されてしまうものが存在する。そういったアプリはやはり広告を非表示にするしかないな、という気持ちになるのである。

- (void)layoutSubviews

が何かを表示したり非表示にしたりするのに使われるので、これを使うことにする。

方法1 Hidden属性を使う

  • メリット
    実装がとても簡単。
  • デメリット
    広告が表示されていたスペースがそのまま残るので、不自然な何も表示されていない場所がそのまま残ってしまう。

単純に広告を非表示にするにはhiddenプロパティを利用する。
これは、広告表示に使われているクラス全体を非表示にするというものである。

@interface ADBannerView
@property (nonatomic, assign, readwrite, getter=isHidden) BOOL hidden;
@end
%hook ADBannerView
- (void) layoutSubviews
{
self.hidden = YES;
}
%end

%origと書けばそのメソッド自体を実行してくれるのであるが、広告を表示しているインスタンスを実行すること自体が無駄なのでそもそもそれを書かない。
というか、この場合であればhiddenしなくても「何も実行しない」とすれば非表示になりそうな気がするのだが、このインスタンスを呼び出すときにフレーム等が生成されてしまっている可能性もあるので念には念を入れて消しておく。
ただし、このやり方が通用するのは基本的に広告表示用のクラスがあるような場合の時である。例えばUIViewで広告を表示しているなら、この方法で非表示にするとほとんど全ての表示が消えてしまうことになる。UIImageViewの場合も同様である。

方法2 表示領域を0にする

  • メリット
    実装が簡単。
    余計なスペースが消える(こともある)。
    FLEXでは扱えない領域(多分)なので、強みがある。
  • デメリット
    見えないようにしているだけで実際には作られているのでメモリを圧迫する。
@interface ADBannerView
@property (nonatomic, assign, readwrite) CGRect frame;
@end
%hook ADBannerView
- (void) layoutSubviews
{
CGRect rect = CGRectMake(0,0,0,0);
self.frame = rect;
}
%end

方法3 インスタンスを生成しない

  • メリット
    根本的に削除するので最強。
  • デメリット
    生成しないことでバグが生み出される可能性がある。
    どうやったらいいのかよくわかっていない。

やり方がよくわかっていないので解説不可能です。