7

iOS 7 で Dynamic Type をサポートするようにアプリを更新しています。システム設定に応じてテキストのサイズを調整するのは比較的簡単でしたが、UITableView と複数の UILabels を持つセルのコンテキストで使用しているためです。私が心配しなければならないのはテキストサイズだけではありません。テキストが拡大する場合はセルの高さも同様に調整し、テキストが縮小する場合はセルの高さも同様に調整する必要があります。

また、サイズが小さくなると、最大サイズのタイプと比較してアイテム間のスペースが明らかに少なくなります (サイズが小さいとアイテム間のスペースが巨大になるため)。

ユーザーが動的タイプのサイズを変更したときに、これらのようなより高度なレイアウトの問題を変更するにはどうすればよいですか?


今、私はかろうじて機能する本当に醜いことをしています。ラベルの 1 つの高さを見て、定数をそのサイズに合わせてスケーリングします。しかし、要素間のパディングとして使用されている現在のテキストサイズで UILabel の高さの 110% が必ずしも普遍的に機能するとは限らないため、非常に不正確です。

そのため、その例で私がやっていることは次のとおりです。

    CGRect articleTitleRect = [article.title boundingRectWithSize:CGSizeMake(CGRectGetWidth(self.contentView.bounds) - 29, MAXFLOAT)
                                                          options:NSStringDrawingUsesFontLeading
                                                       attributes:@{ NSFontAttributeName: [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline] }
                                                          context:nil];
    self.urlConstant.constant = articleTitleRect.size.height / 5;
    self.previewConstant.constant = articleTitleRect.size.height / 5;

(基本的には、ラベルの高さを調べ、そのパーセンテージを使用して間隔を推測します。繰り返しますが、非常に不正確であり、普遍的にうまく機能しません。)

私が考えたもう1つのことは、現在preferredFontForTextStyle:がポイントサイズでどれに等しいかを確認し、特定の値についてインターフェースの調整/間隔をハードコーディングすることでした。これは少しうまく機能しますが、Apple が念頭に置いていたものにはまだ最適ではないようです。 t バットをオフにします (ハックのように見えます)。


では、Tweetbot 3 (現在、Dynamic Type を使用して UITableViewCell 要素を設定する) などのアプリは、さまざまな Dynamic Type サイズで UI の見栄えを良くするために何をしているのでしょうか? これを行う最善の方法は何ですか?正直なところ、このトピックに関するチュートリアルはないようです。

4

2 に答える 2

1

これは自分で行う必要がありますが、iOS には TextKit で必要なツールが用意されています。Test Programming Guideには実際に多くのドキュメントがあります 。

たとえば、「フォント オブジェクトの操作」セクションのUIContentSizeDidChangeNotificationは、動的タイプの値が変更されたことをアプリに通知userInfoし、新しい値を持つ辞書を使用します。これは、変更を加えるためのエントリ ポイントです。たとえば、新しい値が の場合、UIContentSizeCategoryAccessibilityMedium2 つのラベル間の距離は 10 ポイントですが、新しい値が の場合、UIContentSizeCategoryAccessibilityLarge15 に設定できます。試行錯誤しながらやらないといけない。ただし、適切な距離を把握したら、すべてが機能することを確認するには、10 行以上のコードを使用する必要はありません。

またUIFontDescriptor、特にそのリファレンスの下部にある定数も見てください。それらを使用すると、想像できるほぼすべてのフォント プロパティと特性にアクセスできます。これを使用して、カスタム プロパティを使用して独自のフォントを「構築」できます。そのようにしたい場合は、もう少しコードが必要になりますが、TextKit は画面にテキストを表示するためのさまざまな API を提供します。

于 2013-11-05T00:53:57.283 に答える
0

動的タイプはまだ使用していません。しかし、使用できるアプローチの 1 つは、自動レイアウトを使用してセル コンテンツをレイアウトし、自動レイアウト エンジンに必要なセルの高さを決定させることだと思います。次に、動的な型のサイズが更新されたら、テーブルビューに再読み込みまたは再計算を要求するだけです (beginUpdates/endUpdates を介して)。

ここで、自動レイアウトを使用して特定のセルのテーブルビュー セルの高さを計算する方法の例で質問に答えました。

自動レイアウトですべてのサブビューに合わせてスーパービューのサイズを変更する方法は?

編集

あなたのコメントごと:

ここでは高さは問題ではありません。簡単に計算できます。私の質問は、たとえばラベル間のスペースなど、ラベルが大きくなるにつれてスペースもわずかに大きくなるなど、より難しいことに対処する方法です。また、基本的に、Dynamic Type の影響を受けるレイアウトを最適に調整する方法を学んでいます

制約を作成して登録した後、実行時に制約を調整する必要がある場合はいつでも、制約のconstantプロパティを調整することによって行います。そのため、他のプロパティ (テキスト サイズなど) に基づいて 2 つのアイテム間の間隔を微調整したい場合は、これら 2 つのアイテムの間隔を管理する制約定数を手動で調整する必要があります。制約が Interface Builder で作成された場合、コードで参照できるように、それをどこかの IBOutlet にバインドする必要があります。

制約には乗数プロパティもあり、他のビューの計算された属性値に基づいて 1 つの制約を動的に調整するために使用できます。Interface Builder でこれを操作できるとは思いませんが、コードで制約を作成すれば操作できます。乗数を使用すると、他の要素の高さに基づいて大きくまたは小さく調整する間隔の制約を設定できるはずです。

より複雑なシナリオでは、単純な間隔の制約を微調整するだけでなく、プロパティの変更 (テキスト サイズなど) を考慮してレイアウトを大幅に変更したい場合があります。この場合、次のいずれかをお勧めします。

1) 制約を完全にコードで作成および管理します。レイアウトの変更が必要であると判断した場合は、適切な一連の制約を破棄して構築します。

2) 複数の nib を作成して、Interface Builder で定義された制約を介して複数の UI レイアウトを管理します。レイアウトの変更が必要であると判断した場合、正しいペン先を動的にロード/リロードします。これのおそらく望ましくない副作用は、すべてのビュー/コントロールが再作成されることです。

于 2013-10-31T20:50:11.977 に答える