2013-07-10 8 views
14

UITableViewのような要素、iOSの7の上に別のスタイルを持っているUINavigationBariOS 7はどのようにUI要素を実装するので、どのSDKをコンパイルするかによって表示が異なりますか?

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

だから、iOS 7で実行されるアプリは、iOS 7で見えるように見えると思うでしょう。しかし、iOS 7と同じスタイルを保ちます。 SDK。それらのいくつかを除いて、このための私の唯一の説明は、彼らがこのような種類の何かをするということである

UIAlertViewまたはUIMenuControllerなど):彼らは維持しておく必要がある原因

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

これは、明らかに、本当に厄介です古いコードがたくさんある。だから、私は興味があります、これは実際にボンネットの下で起こっているのでしょうか?私は何が欠けていますか?

+5

@Unicorn:しかし、彼はNOSの対象となるiOS 7固有のものについては問いません。この質問は** iOSの** 2つのバージョンに適用されます。 – lnafziger

+2

残念ながら、あなたがAppleのコーダーでない限り、Apple **がどのようにして**どのようにしているのかという疑問に本当に答えることはできません。あなたはあなたの質問に言い直すなら**あなた**がそれを行うことができる方法*についていくつかのアイデアを得るかもしれません。 – lnafziger

+2

これは、あなたがアップルで働かなくても、実際には答えられるかもしれません、そして、それは意見ではありません:私の大学は、彼らが何らかの分解をしていることを発見しました。 –

答えて

9

NDA'dの領土にあまり行くがなければ、私はちょうどそう、彼らは次の呼び出しから結果のオフに基づいて、外観と動作を条件付けている状態したいと思います:

_UIApplicationUsesLegacyUI() 

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

これは、はい、レガシー用のUIKitの条件付き部分であることを意味します。それは良いことだとは思っていませんが、それは彼らがやることに決めました。

-1

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

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

+0

これは可能な考えのように聞こえますが、見た目が違うものがいくつかあるためにはあり得ません。 'UIActionSheet'、' UIAlertView'、 'UIMenuController'のように... –

+0

この場合、iOS 7デバイスは以前のSDKの外観を更新できます。 OSのバージョンが古いSDKをまったく更新できないということは何もありません。これは、OSがマイナーリリース(6.0.1,6.0.2など)用にSDKを更新する方法で、新しいバージョンのSDKでアプリケーションを再リンクする必要はありません。新しいバージョンのSDK(6.1など)にアップデートする理由は、そのバージョンで導入された新しいものを使用することだけです。 – Streeter

+0

私は彼らがしたことを本当に疑っています:P古いSDKを再コンパイルしますか?彼らが望むものが後方互換性を持っていれば、意味のない古いアプリを壊すことはありません。 –

4

私の考えでは、framework compatibility versionsを使用しています。

あなたのアプリケーションをコンパイルするたびに、あなたのアプリは特定のフレームワークと互換性のあるバージョンと現在のバージョンでリンクされます。 otool -L YourApp.app/YourAppを実行すると、その番号が表示されます。あなたはUIKitフレームワークの完全なパスがバージョンのカップル(と特別に沿って、マッハ-Oバイナリに格納されて見ることができるように

/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) 

:例えば、いくつかの時間前にコンパイルされたアプリケーションのために、私はこれを得ました私はその時点でコンパイルされたバージョン)。

iOS 7には、対応するバージョンが表示され、互換性が1.0.0であるiOS6のものと、1500.0.0以上のものと互換性があるとマークされたiOS7のものが含まれます。それがiOS 6.1.3の番号であるかどうかは分かりませんが、あなたはそのアイデアを得ています)。

あなたのiOS6のバイナリがロードされると、そのライブラリの依存関係は、dyldによって読み取られ、あなたがcurrent version 1500.0.0を言ってコンパイルされたため、解決、およびiOSの7のためのライブラリは、あなたが

のiOS 6のためのライブラリとリンクされます、 compatibility version 1501.0.0語ります

フレームワークもバンドルなので、すべてのリソースが完全に含まれており、正しいバージョンでのみ使用されます.iOS 6 SDKまたはiOS 7 SDKとコンパイルすると、さまざまな視覚的要素がどのように違うのでしょうか。

私は間違っているかもしれませんが、あなたが提案するコードテクニックを使用していないことを願っています。これは、維持するための厄介なコードベースになるためです。

+0

私は、iOSに同じフレームワークの複数のバージョンが付属しているとは思わない。あなたの例では、1501.0.0バージョンは1500.0.0バージョンと下位互換性があります。しかし、正しく言ったように、アプリケーションがリンクされたバージョン番号はバイナリに記録されているため、実行時に確認することができます。 –

+0

これはまだ特定のクラスが新しい外観(例えば 'UIAlertView')を持っている理由を説明していません –

+0

@MartinR:実行時のチェックは可能ですが、ダブルバイナリは扱いやすいと思います。移行期間中にAppleが何をしなければならないのかを実行する必要がある場合は、実行時にこれらのチェックを行わないことを選択します。 – yonosoytu

関連する問題