24

シンプルな iPhone アプリで、 viewDidLoadの次のコードでレター タイル (UIView画像と 2 つのラベルを使用したカスタム)を表示します

アプリのスクリーンショット

DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile"
                                                   owner:self
                                                 options:nil] firstObject];
tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        kWidth,
                        kHeight);
[self.view addSubview:tile];

これは問題なく動作しますが、より大きな幅と高さのパラメーターをCGRectMake.

そのため、Xcode 5.1 Interface Builder で を開き、DraggedTile.xib「自動レイアウト」を有効にします。

次に、親の左、上、右、下の端に制約を追加しますimageletter

ラベルについては、letter「Lines」を 0 に、「Content Compression Resistance Priority」を 1000 に設定しました (ここではfullscreen 1fullscreen 2 )。

Xcode のスクリーンショット

Xcode のスクリーンショット

次に、より大きな幅と高さを使用するようにコードを変更します。

tile.frame = CGRectMake(10 + arc4random_uniform(100),
                        10 + arc4random_uniform(100),
                        2 * kWidth,
                        2 * kHeight);

結果は次のとおりです。

アプリのスクリーンショット

背景imageletterラベルも思い通りに伸びたようです。

ただし、ラベルのフォント サイズは大きくなりません。

私は周りを検索しましたが、次のようなものが必要だと思いますtile.letter.adjustsFontSizeToFitWidth = YES。しかし同時に「自動レイアウト」がオンになっていると使用できません...

私の質問は、「Interface Builder」にフォントサイズを大きくするためのオプションがあるかどうかです。

アップデート:

Interface Builderとコード でフォントサイズを200に設定するというismailgulekの提案を試してみましたが、tile.letter.adjustsFontSizeToFitWidth = YES有望に見えます(ここではfullscreen ):

Xcode のスクリーンショット

letter.bottomしかし、Interface Builderで制約として 40px を設定したという問題があります。しかし、より大きなタイル フレームが必要な場合はどうすればよいでしょうか。その制約で絶対ピクセル値の代わりにパーセンテージを使用する方法はありますか?

もう 1 つの質問adjustsFontSizeToFitWidthは、Interface Builder のどこかに設定できるかどうか、またはそのためにソース コードを使用する必要があるかどうかです。「ユーザー定義のランタイム属性」にキーを追加しようとしましたが、実行時にアプリがクラッシュします。

Xcode のスクリーンショット

4

6 に答える 6

14

タイトルでここに来て、簡単な解決策が必要な人のために(何時間もの調査の後):

問題の例:自動レイアウトを使用し、UILabel の高さを画面の高さに比例するように設定すると、iPhone (横向き) では低く、iPad では高いフレームが得られます。フォントの高さを自動的に調整する方法は?

解決策: Interface Builder で、

  1. 「自動縮小」を「最小フォント サイズ」に設定し、サイズを設定します (幅が広すぎるテキストに影響しますが、ソリューションには必要です)。
  2. 「Lines」を 0に設定し、フォント サイズを iPad で得られるフレームより大きくします

これにより、フォントが現在の高さに自動的に増加します。

于 2016-02-02T03:19:02.083 に答える
1

Interface Builder のクラスを独自の派生クラスに置き換えて、そこでサイズ変更を行うことができます。

例:

/**
MYLabel does exactly the same like UILabel, except that the font size will automatically shrink 
if the code is executed on an iPhone.
*/

class MYLabel: UILabel {

    var onlyOnceToken: dispatch_once_t = 0

    override func drawRect(rect: CGRect) {

        dispatch_once(&onlyOnceToken) {

            if let usedFont:UIFont = self.font {

                // define your reference size here
                let iPadHeight:CGFloat = 768
                let screenBounds = UIScreen.mainScreen().bounds
                let scale:CGFloat =  screenBounds.height / iPadHeight
                self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale)
            }
        }

        super.drawRect(rect)
    }
}

これからは、IBのID インスペクターでUILabelクラスをMYLabelに置き換えるだけで、すべてのフォントがデバイスの高さに比例して自動的にサイズ変更されます。

ラベルサイズと一緒に大きくしたいだけの場合は、

let screenBounds = UIScreen.mainScreen().bounds

let screenBounds = self.bounds.height

またはその他のカスタム スケール式。UIFontは、このアプローチで多くのことができる追加の測定プロパティを提供します。

于 2015-06-11T10:07:40.507 に答える
1

また、「改行」を「Word Wrap」から「Truncate Tail」に設定してください。</p>

于 2020-04-23T23:29:16.193 に答える