サイズクラスを使用してiPhone 6およびiPhone 6プラスポートレートスクリーンを一意に識別する方法
私のアプリはiPhone 4とiPhone 5では見栄えが良いですが、iPhone 6と6で多くの空きスペースがあり、画面サイズのために同じように見えます。自動レイアウトを使用していますが、フォントサイズやビューサイズを増やすことはできません。iPhone6および6 plusのみの場合のみです。サイズクラスを使用してフォントサイズとビューサイズを変更できることを知っていました。しかし、私の場合、何をすべきか分かりません。
XCode 6.1を使用していて、私のアプリはiOS 7から最新のiOS 8.1までをサポートしています。 UI設計をストーリーボードで完全に実行しているので、ストーリーボードでのみソリューションを期待しています。ストーリーボードの機能が制限されて私のニーズを達成できる場合は、アプリ全体でコードを使用して同じことを達成する方法を教えてください。
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」プロパティをユーザー定義のランタイム属性のリストに追加します(タイプ「ブール」とチェックボックスをオンにした状態)。
調整したい各ラベルについて同じことを行います(コピー&ペーストは驚くほどここで機能します)。
ストーリーボードでコンパクトな幅と通常の高さを使用する
乗数を追加することにより、スーパービューで高さと幅の相対的なレイアウト制約を追加します。スーパービューの半分のサイズのイメージビューがあり、乗数0.5を追加するとします。
さまざまなiPhoneデバイスのさまざまなフォントサイズについて、sizeClassについてあまり考えていませんが、この解決策を考え出しました。
- このメソッドをユーティリティクラスに追加します。
- スーパービューをこのメソッドに渡すだけです。このメソッドは再帰的であるため、self.viewを渡すと、すべてのサブビューが設定されます。
- 必要に応じてフォントサイズを変更します。
-(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];
}
}
}
@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()
}
AdjustsFontSizeToFitWidth @ ILabel Class Reference を確認してください。これにより、さまざまなデバイスに基づいていくつかの素敵な調整を行うことができます。
label.adjustsFontSizeToFitWidth = YES;
これには少し遅れましたが、どのデバイスにも拡張できるラベルが必要で、この方法を使用しました。
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の全画面を表示する大きなラベルが必要になる場合があります。
多くの苦労の後、私の必要なものを見つけたので、将来の読者のためにそれを投稿してください。
[〜#〜] edit [〜#〜]24-SEP-2015最近見つけたUITraitColleection
を使用してサイズクラスをカスタマイズする方法は、iPhone 6 plusの場合のみであり、コードの多くを記述する必要はありません。私はこれが link が将来誰かを助けることを願っています。
おそらく、大きな画面に最適なフォントサイズを設定してから、Autoshrink
を小さな画面に最適なサイズでminimum font size
に設定すると、コーディングせずに動的なフォントサイズを取得できます。
いずれにしても、ラベルのサイズを画面サイズに合わせて調整するには、ラベルの制約を設定する必要があります。
この助けを願っています
これは、実行時に2つの異なるフォントサイズを切り替えるために使用する関数の例です。使用するフォントは、水平サイズクラスに基づいて決定されます。これにより、デバイスは「iPad」と「iPhone」の2つのグループに本質的に分割されます。デバイスがどのサイズクラスに属しているかについての良いリファレンスを以下に示します。 http://useyourloaf.com/blog/size-classes/
func chooseFont(compactFont: UIFont, regularFont: UIFont) -> UIFont { let appDelegate = UIApplication.shared.delegate as! AppDelegate return appDelegate.window!.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.compact ? compactFont : regularFont }
あなたのスクリーンショットに基づいて、私はダイナミックタイプを使用することをお勧めします。このようにして、ユーザーはテキストのサイズを管理します。