問題タブ [swizzling]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - iOS のぼやけたテキスト: 検出して完全に解決しますか?
UIView (サブクラス) が分数オフセットになる状況に何度も遭遇しました。たとえば、その寸法が奇数で中央に配置されているため、またはその位置が奇数サイズのコンテナーの中心に基づいているためです。
これにより、テキスト (または画像) がぼやけます。これは、iOS が半ピクセル オフセットでビュー (およびサブビュー) をレンダリングしようとするためです。CGRectIntegral()
すべてのフレーム変更を要求することは、完全な解決策ではないと感じています。
これらの状況を簡単に検出するための最良の方法を探しています。この質問を書いているときに、私は非常に抜本的なアプローチを思いつきました。これにより、現在のプロジェクトで、想像以上に ½ ずつずれていることが明らかになりました。
これは共有用です。より良い、またはあまり抜本的でない代替案についてのコメントや提案は大歓迎です。
main.m
UIViewOverride.m
これは UIView サブクラスとして実装され、キャストやコンパイラの警告を回避します。
問題のあるビューでは、ログ メッセージが生成され、透明になり、赤または緑になります。
-DDEBUGVIEW
デバッグ モードでコンパイラ フラグとして設定されます。
objective-c - メソッドのスウィズリング - メソッドが呼び出される前に確実にスウィズリングされる方法
SIMBL を使用して NSMenuItems のサード パーティ アプリケーションの作成をメソッド スウィズリングしていますが、メソッド スウィズリングが初期化される前に、50/50 の時間でメニュー項目が作成されます。
スウィズルが常に最初に来るようにするためのクリーンな方法は何ですか? applicationDidFinishLaunching: をスウィズルして、そこでスウィズルを続けることができると思います。しかし、実際のスウィズルが配置される前に applicationDidFinishLaunching が呼び出されるという同じエラーが発生するのではないかと心配しています。
ジョン
ios - Objective-C でのメソッド スウィズリングの危険性は何ですか?
メソッドの入れ替えは危険な行為だと人々が言うのを聞いたことがあります。スウィズリングという名前でさえ、それが少しチートであることを示唆しています。
メソッド スウィズリングは、呼び出しセレクター A が実際に実装 B を呼び出すようにマッピングを変更しています。これの 1 つの用途は、クローズド ソース クラスの動作を拡張することです。
スウィズリングを使用するかどうかを決定しているすべての人が、自分がやろうとしていることに価値があるかどうかを十分な情報に基づいて決定できるように、リスクを形式化できますか。
例えば
- 名前の衝突: クラスが後でその機能を拡張して、追加したメソッド名を含めると、大きな問題が発生します。慎重に入れ替わったメソッドに名前を付けることで、リスクを軽減します。
objective-c - メソッドの入れ替えを実装するにはどうすればよいですか?
SIMBL を使用してプログラムの動作を変更しようとしています (ソースがありません)。クラスダンプを使用したところ、インスタンスメソッドをオーバーライドする必要があることがわかりました
このメソッドは、controller というクラスにあります。私がする必要があるのは、引数 arg1 を取得することだけです。多分 NSLog するか、通知を投稿してください... Objective-C のメソッドのスウィズリングについて読みましたが、どのように使用できますか?. コースを持っていないクラス MessageController を参照する必要があります。
ありがとう!
iphone - iPhone:APIの制限を回避するための興味深い方法を考え出しました。これは機能しますか?
私が解決しようとしている問題はこれです:
UIImagePickerを使用する場合、デバイスが回転すると自動的に調整されます。私はそれがこれをすることを望まない、むしろそれは常に縦向きにとどまるべきである。私はたくさんグーグルで検索しましたが、解決策は見つかりませんでした(同じ未解決の問題を抱えている他の人だけ)。唯一の答えは、プライベートAPI呼び出しを使用することでした。私は、これを行うリスクを冒したくありません。
-
しかし、私は「メソッドのスウィズリング」に出くわしました。これは、実行時にメソッド名を交換する方法です。私がやろうとしていること:
回転を許可しないカスタム動作を定義する「customShouldRotate」などのメソッドを定義するカテゴリをUIViewControllerに追加します。
実行時にUIViewControllerのデフォルトの回転メソッドを使用してこれらのメソッドをスウィズルします。
-
少し考えてみると、それほど単純ではないかもしれません。理由は次のとおりです。次のような回答をいただければ幸いです。
私がスウィズリングしているメソッドは、UIImagePickerControllerではなくUIViewControllerにあります。画像ピッカーを直接スウィズルすることはできません。すでにサブクラス化を試しましたが、UIImagePickerController自体ではなく、回転を処理するサブビューのコントローラーのようです。スウィズルされたメソッドはサブクラスに渡されますか?そうでない場合、これを行うための回避策はありますか?
UIImagePickerControllerで使用されているUIViewControllerの通常のローテーションメソッドではない可能性があります。伝える方法はありますか?
Appleはメソッドのスウィズリングで大丈夫ですか?私はプライベートAPI呼び出しを使用していませんが、それでも、彼らがとにかくそれを拒否したとしても、私はそれほど驚かないでしょう。
-
このアイデア全体が実行可能/試す価値がありますか?または、誰かが実際に元の問題を別の方法で解決した場合、それはさらに良いでしょう。
iphone - カスタマイズされたナビゲーションバーはボタンを非表示にします
これも手伝ってくれるといいのですが...カスタムの背景画像を追加してナビゲーションバーをカスタマイズしたかったのです。私は完璧ですが、NavigationSwizzleと呼ばれる少し複雑な方法を見つけました。以前のプロジェクトでは深刻な問題は発生しませんでしたが、今は行き詰まっています...
AppDelegateから、この静的メソッドを呼び出しています。
}
rootNavigationControllerで、スタック上で2番目のView Controllerを押して呼び出した後、右ボタンself.title、activityIndicatorが表示されません。コメントするか、atIndex:-1を[navBar insertSubview:imageView atIndex:0]行に設定すると; 次にボタンが表示されますが、カスタマイズした背景がなくなり、通常のiPhoneナビゲーションタブが表示されます。
rootNavigationControllerのdidSelectRowAtIndexには、次のものがあります。
前もって感謝します...
さらにコードや説明が必要な場合は、遠慮なく私に聞いてください...
よろしく、ルカ
編集:
わかりました。この質問をもっと簡単にすることができます。ナビゲーションバーにカスタムの背景画像があります。この画像は明らかに私の
バックグラウンドにあるimageViewの0.3にアルファを設定すると、タイトルが表示されます。
だから問題は、navigationItem.titleをフロントに送信するにはどうすればよいですか?UIViewクラスの子孫ですか?
編集2: 本当に奇妙なことは、rootControllerにタイトルが(背景画像の上に)表示されているのに、別のviewControllerを押した後、タイトルが背景imageViewの後ろに表示されることです。
objective-c - Swizzling initWithFrame: NIB 内のオブジェクトでは機能しない
MKMapView と UIScrollView で initWithFrame: と dealloc を切り替えて、通知リスナーを追加および削除し、外部デバイスへの接続を監視して、これらのビューに追加のジェスチャ認識機能を接続できるようにします。
これは、コードで作成したビューではうまく機能しますが、それらを XIB で宣言すると、メソッドが呼び出されません。このサポートをハードコーディングしたくないので、継承の代わりにスウィズリングを使用しています。ターゲットごとに追加できるようにしたいのです。
これらのオブジェクトをフックして、プログラムで作成するか NIB で作成するかに関係なく、これらのタイプのすべてのオブジェクトにジェスチャ レコグナイザーを追加するにはどうすればよいですか?
objective-c - Objective-Cからclass_getInstanceMethodを使用して保存したメソッドを呼び出すにはどうすればよいですか?
以下のコードを使用して以前に保存したメソッドを呼び出すにはどうすればよいですか?
ご想像のとおり、後で元のメソッドをスウィズルするため、呼び出し[SomeClass someMethod]
は機能しません。
objective-c - NSArray のメソッドの入れ替え
NSArray で何かをデバッグしようとしていますが、問題の原因となっている配列へのポインターが何であるかを見つけることさえできず、なぜそれが起こっているのかわかりません。objectAtIndex: (範囲外) でエラーが発生し、内部の NSView メソッドから来ているようです...とにかく、objectAtIndex: を自分でスウィズリングしようとしましたが、うまくいきません。奇妙なのは、別のクラスとメソッドを使用して同じことを行うことができ、それが正常に機能することです。これが私がスウィズルするためにしていることです:
そしてそれは機能していません。誰かが理由を知っていますか?
更新: Dave に感謝します。おそらくそれが問題でした。インスタンスの代わりに getClassMethod もありました。とにかく、これが私がやったことです:
glsl - OpenGL ES 2.0のスウィズリングを正確に構成するものは何ですか?(特にPowerVR SGX。)
PowerVRは言う
lowpベクトルのコンポーネントをスウィズリングすることはコストがかかるため、避ける必要があります。
スウィズリングとは正確には何ですか?
しかし、色がvec4の場合vec3(color.b, color.r, color.g)
、またははどうでしょうか。vec3(color)
単一のコンポーネントにアクセスまたは変更することは、スウィズルを構成しますか?私は本当にそうは思いませんが、そうでない場合は、手動でさらにいくつかの代入操作を行うだけで、スウィズリングを回避できます。私はそれを行うのに問題はありませんが、スウィズル表記なしでコードを書くだけで同じ効果をより速い速度で得ることができれば、それは私には魔法のように思えます。