14

iOS 7 ではスタイルが異なるUITableView、などの要素があります。UINavigationBar

UIKitこれらのクラスは に実装されており、UIKitコンパイル時に静的ではなく、実行時に動的にアプリケーションとリンクされるため、このスタイルは実行時に決定されます。

そのため、iOS 7 で実行されるすべてのアプリは、これらの要素が iOS 7 での外観と同じように見えると考えられます。ただし、iOS 7 SDK でコンパイルするまでは、iOS 6 で使用されていたのと同じスタイルを維持します。それらの一部を除いて (UIAlertViewまたはのようにUIMenuController)

これについての私の唯一の説明は、彼らが次のようなことをするということです:

#define SDKApplicationWasLinkedAgainst ...
if (SDKApplicationWasLinkedAgainst < 7.0)
    ...
else
    ...

多くの古いコードを維持し続ける必要があるため、これは明らかに非常に面倒です。興味がありますが、これは本当に内部で起こっていることですか? 私は何が欠けていますか?

4

3 に答える 3

9

NDA の領域にあまり踏み込まずに、はい、次の呼び出しの結果に基づいて外観と動作を条件付けしているとだけ述べておきたいと思います。

_UIApplicationUsesLegacyUI()

次に、この関数は を呼び出しますGSApplicationUsesLegacyUI()。これは、リンクされた UIKit のバージョンに基づいて結果を返すと思われます。

これは、はい、UIKit の一部をレガシー用に条件付けしていることを意味します。それが良いことかどうかはわかりませんが、それが彼らがやろうと決めたことです。

于 2013-08-13T22:18:11.233 に答える
4

私の賭けは、彼らがフレームワーク互換バージョンを使用していることです。

アプリをコンパイルするたびに、互換性のあるバージョンと現在のバージョンを使用して、特定のフレームワークに対してアプリがリンクされます。を実行すると、これらの数値を確認できますotool -L YourApp.app/YourApp。たとえば、しばらく前にコンパイルされたアプリケーションの場合、次のように取得しました。

/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 751.58.0)
/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 1500.0.0)

ご覧のとおり、UIKit フレームワークのフル パスは、いくつかのバージョン (特に、その時点でコンパイルしたバージョン) と共に Mach-O バイナリに格納されています。

iOS 7 には両方の UIKit バージョンが含まれていると思います: iOS6 のものには対応するバージョンと 1.0.0 からの互換性があるとマークされており、iOS7 のものは 1500.0.0 以上のものと互換性があるとマークされています (私は知りません)それが iOS 6.1.3 の番号である場合、しかし、あなたはアイデアを得る)。

iOS6 バイナリが読み込まれると、そのライブラリの依存関係が読み取られdyldて解決されます。これは、 と言ってコンパイルされcurrent version 1500.0.0、iOS 7 のライブラリが と言ってcompatibility version 1501.0.0、iOS 6 のライブラリに対してリンクされるためです。

フレームワークもバンドルであるため、すべてのリソースが完全に含まれており、適切なバージョンでのみ使用されます。これが、iOS 6 SDK または iOS 7 SDK に対してコンパイルした場合のさまざまな視覚要素の外観の違いです。

私は間違っているかもしれませんが、あなたが提案するコード手法を彼らが使用していないことを願っています。

于 2013-07-10T19:40:12.313 に答える
-1

確実なことは言えませんが、これはそれがどのように行われるかについての 1 つの推測です。アプリがリンクされた SDK のバージョンを知っているため、iOS 7 デバイスのフレームワークをバージョン アウトします。そのため、ファイルシステムには の行に沿った階層があります/.../iPhoneOS6.1.sdk/.../Frameworks/UIKit。その後、アプリが読み込まれるときに、アプリがリンクされた SDK を指すようにライブラリの検索パスを設定するだけです。

これが、現在 Xcode が行っている方法です。Xcode パッケージ内の Developer ディレクトリ内には SDKs ディレクトリがあり、このディレクトリには、リンクするさまざまな SDK がすべて含まれています。

于 2013-07-10T19:04:46.090 に答える