web-dev-qa-db-ja.com

iPhone 6およびiPhone 6プラスポートレートを識別するサイズクラス

サイズクラスを使用してiPhone 6およびiPhone 6プラスポートレートスクリーンを一意に識別する方法

私のアプリはiPhone 4とiPhone 5では見栄えが良いですが、iPhone 6と6で多くの空きスペースがあり、画面サイズのために同じように見えます。自動レイアウトを使用していますが、フォントサイズやビューサイズを増やすことはできません。iPhone6および6 plusのみの場合のみです。サイズクラスを使用してフォントサイズとビューサイズを変更できることを知っていました。しかし、私の場合、何をすべきか分かりません。

XCode 6.1を使用していて、私のアプリはiOS 7から最新のiOS 8.1までをサポートしています。 UI設計をストーリーボードで完全に実行しているので、ストーリーボードでのみソリューションを期待しています。ストーリーボードの機能が制限されて私のニーズを達成できる場合は、アプリ全体でコードを使用して同じことを達成する方法を教えてください。

19
Bluewings

IPhoneのタイプに応じてフォントサイズを調整する別のオプションは、「ユーザー定義のランタイム属性」を使用することです。

UILabelの拡張を定義します。

extension UILabel {
    var adjustFontToRealIPhoneSize: Bool {
        set {
            if newValue {
                var currentFont = self.font
                var sizeScale: CGFloat = 1
                let model = UIDevice.CurrentDevice().modelName()

                if model == "iPhone 6" {
                    sizeScale = 1.3
                }
                else if model == "iPhone 6 Plus" {
                    sizeScale = 1.5
                }

                self.font = currentFont.fontWithSize(currentFont.pointSize * sizeScale)
            }
        }

        get {
            return false
        }
    }
}

現在のモデル名を確認するには、次の回答を参照してください: https://stackoverflow.com/a/26962452/4165128

ストーリーボードで、調整するラベルを選択し、右側のペインを開いてIDインスペクターを選択し、「adjustFontToRealIPhoneSize」プロパティをユーザー定義のランタイム属性のリストに追加します(タイプ「ブール」とチェックボックスをオンにした状態)。

調整したい各ラベルについて同じことを行います(コピー&ペーストは驚くほどここで機能します)。

24
Alonzo

ストーリーボードでコンパクトな幅と通常の高さを使用する

Use Compact width and Regular Height in storyboard

乗数を追加することにより、スーパービューで高さと幅の相対的なレイアウト制約を追加します。スーパービューの半分のサイズのイメージビューがあり、乗数0.5を追加するとします。

enter image description here

8
Jignesh Agola

さまざまなiPhoneデバイスのさまざまなフォントサイズについて、sizeClassについてあまり考えていませんが、この解決策を考え出しました。

  1. このメソッドをユーティリティクラスに追加します。
  2. スーパービューをこのメソッドに渡すだけです。このメソッドは再帰的であるため、self.viewを渡すと、すべてのサブビューが設定されます。
  3. 必要に応じてフォントサイズを変更します。
-(void)setAllFonts:(UIView *)view
{

CGFloat fontSizeDiff = 0.0;

if (IS_IPHONE_6)
{
    fontSizeDiff = 1;
}
else if (IS_IPHONE_6PLUS)
{
    fontSizeDiff = 2;
}

for (UIView *vw in [view subviews])
{
    if ([vw isKindOfClass:[UILabel class]] || [vw isKindOfClass:[UIButton class]])
    {
        if ([vw isKindOfClass:[UILabel class]])
        {
            UIFont *font = [(UILabel *)vw font];
            [(UILabel *)vw setFont:[UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff]];
        }
        else
        {
            UIFont *font = [(UIButton *)vw titleLabel].font;
            [(UIButton *)vw titleLabel].font = [UIFont fontWithName:font.fontName size:font.pointSize+fontSizeDiff];
        }
    }
    else if ([vw isKindOfClass:[UIView class]] || [vw isKindOfClass:[UIScrollView class]])
    {
        [self setAllFonts:vw];
    }
}
}
2
iBhavik

@iBhaviksのSwiftバージョンの回答:

func getFontScaleForDevice() -> CGFloat {
    var sizeScale = CGFloat(1.0)
    if DeviceType.IS_IPHONE_6 {
        sizeScale = 1.2
    } else if DeviceType.IS_IPHONE_6P {
        sizeScale = 1.4
    } else if DeviceType.IS_IPAD {
        sizeScale = 1.4
    }
    return sizeScale
}

func setAllFonts(targetView:UIView, scale:CGFloat) {
    for vw in targetView.subviews {
        if let vl = vw as? UILabel {
            vl.font = vl.font.fontWithSize(round(vl.font.pointSize * scale))
        } else if let vb = vw as? UIButton, vbl = vb.titleLabel {
            vbl.font = vbl.font.fontWithSize(vbl.font.pointSize * scale)
        } else if vw.subviews.count > 0 {
            setAllFonts(vw, scale: scale)
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    let sizeScale = getFontScaleForDevice()
    if sizeScale > CGFloat(1.0) {
        setAllFonts(view, scale: sizeScale)
    }
    view.layoutIfNeeded()
}
2
ergunkocak

AdjustsFontSizeToFitWidth @ ILabel Class Reference を確認してください。これにより、さまざまなデバイスに基づいていくつかの素敵な調整を行うことができます。

label.adjustsFontSizeToFitWidth = YES;
2
Mark McCorkle

これには少し遅れましたが、どのデバイスにも拡張できるラベルが必要で、この方法を使用しました。

UILabelの新しいサブクラスを作成し、.hファイルにこれを配置します…

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface OTHD_ScalableLabel : UILabel

@property (nonatomic, assign) IBInspectable CGFloat fontScale;

@end

そして.mファイルにこれを入れてください...

#import "OTHD_ScalableLabel.h"

@implementation OTHD_ScalableLabel

- (void) layoutSubviews
{
    [super layoutSubviews];

    if( self.fontScale < 0.1 || self.fontScale > 1.0 )      self.fontScale = 1.0;

    CGFloat height = CGRectGetHeight(self.bounds) * self.fontScale;

    if( height )        self.font = [UIFont fontWithName:self.font.fontName size:height];
}


@end

その後、IBでクラスを変更するだけで、IBInspectableを使用してラベルを拡大または縮小できます。明らかに、そこにある知識論者にとって、これは一般的な使用には適していませんが、たとえば、iPhoneの全画面とiPadの全画面を表示する大きなラベルが必要になる場合があります。

1
amergin

多くの苦労の後、私の必要なものを見つけたので、将来の読者のためにそれを投稿してください。

  1. 現在のところ、サイズクラスを使用してiPhone 6モデルのポートレートを一意に識別する方法はありません。ただし、コンパクトな幅と通常の高さを使用して、すべてのiPhoneポートレートスクリーンをデザインできます。
  2. フォントサイズを変更するには、コードを使用してアプリが現在実行されているiPhoneを識別し、それに基づいてフォントサイズを設定する必要があります
  3. 私の要件-すべての画面サイズで同じレイアウト-幅と高さの制約に乗数を使用します。詳細については、この質問に対するJigneshの回答を確認してください。

[〜#〜] edit [〜#〜]24-SEP-2015最近見つけたUITraitColleectionを使用してサイズクラスをカスタマイズする方法は、iPhone 6 plusの場合のみであり、コードの多くを記述する必要はありません。私はこれが link が将来誰かを助けることを願っています。

1
Bluewings

おそらく、大きな画面に最適なフォントサイズを設定してから、Autoshrinkを小さな画面に最適なサイズでminimum font sizeに設定すると、コーディングせずに動的なフォントサイズを取得できます。

いずれにしても、ラベルのサイズを画面サイズに合わせて調整するには、ラベルの制約を設定する必要があります。

この助けを願っています

これは、実行時に2つの異なるフォントサイズを切り替えるために使用する関数の例です。使用するフォントは、水平サイズクラスに基づいて決定されます。これにより、デバイスは「iPad」と「iPhone」の2つのグループに本質的に分割されます。デバイスがどのサイズクラスに属しているかについての良いリファレンスを以下に示します。 http://useyourloaf.com/blog/size-classes/

  • iPad以降
  • iPhone PlusおよびDown
 func chooseFont(compactFont: UIFont, regularFont: UIFont) -> UIFont {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.window!.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.compact ? compactFont : regularFont
}
1

あなたのスクリーンショットに基づいて、私はダイナミックタイプを使用することをお勧めします。このようにして、ユーザーはテキストのサイズを管理します。

0
matt