用于识别iPhone 6和iPhone 6 plus肖像的尺寸等级

时间:2014-11-21 16:26:06

标签: ios ios8 xcode6 xcode-storyboard

如何使用尺寸类别唯一识别iPhone 6和iPhone 6以及纵向屏幕?

我的应用程序在iPhone 4和iPhone 5中看起来不错,但由于屏幕尺寸的原因,iPhone 6和6中的空白空间相同。虽然使用自动布局,但我不能仅为iPhone 6和6加上单独增加字体大小或视图大小。我知道我们可以使用大小类来改变字体大小和视图大小。但就我而言,我不知道该怎么做。

使用xCode 6.1和我的应用程序支持从iOS 7到最新的iOS 8.1。我希望只在故事板中使用解决方案,因为我在故事板中完全完成了我的UI设计。如果storyboard的功能有限以满足我的需求,请告诉我如何通过应用程序实现相同的代码?

10 个答案:

答案 0 :(得分:24)

根据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

在情节提要上,选择您要调整的标签,打开右侧窗格,选择身份检查器,然后添加“adjustFontToRealIPhoneSize”'属性到用户定义的运行时属性列表(类型为'布尔'并且复选框已选中)。

对于您希望调整的每个标签执行相同操作(复制和粘贴令人惊讶地在此处工作)。

答案 1 :(得分:8)

在故事板中使用紧凑宽度和常规高度

Use Compact width and Regular Height in storyboard

通过添加乘数,添加相对于超级视图的高度和宽度的布局约束。 假设您有图像视图,其大小超过超视图的一半,然后添加乘数0.5。

enter image description here

答案 2 :(得分:2)

查看adjustsFontSizeToFitWidth @ UILabel Class Reference。这将允许您根据不同的设备做一些很好的调整。

label.adjustsFontSizeToFitWidth = YES;

答案 3 :(得分:2)

  

我不太了解不同iPhone设备中不同字体大小的sizeClass,但我想出了这个解决方案。

     
      
  1. 将此方法添加到您的实用程序类中。
  2.   
  3. 只需将超级视图传递给此方法,此方法是递归的,因此如果您传递self.view,则设置所有子视图。
  4.   
  5. 根据需要更改字体大小。
  6.   
-(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];
    }
}
}

答案 4 :(得分:2)

@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()
}

答案 5 :(得分:1)

也许您可以为大屏幕设置完美的字体大小,然后将Autoshrink设置为minimum font size,使其具有适合小屏幕的完美尺寸,这样您就可以拥有动态字体大小没有编码。

您必须设置标签的约束,以便根据屏幕尺寸调整其大小。

希望这个帮助

答案 6 :(得分:1)

经过艰苦的努力,我发现了一些适合自己需要的东西,所以为未来的读者发布了相同内容。

  1. 截至目前,无法使用Size类唯一识别iPhone 6模型肖像。但是,您可以使用紧凑宽度和常规高度来设计所有iPhone纵向屏幕
  2. 要更改字体大小,您必须使用代码识别当前正在运行的应用程序的iPhone,并根据相同的内容设置字体大小
  3. 根据我的要求 - 所有屏幕尺寸的布局相同 - 在宽度和高度限制中使用乘数。检查Jignesh这个问题的答案,了解更多相关信息。
  4. 编辑 24-SEP-2015 我最近找到了一种方法来定制你的尺寸等级,只为iPhone 6 plus使用UITraitColleection,这样你就不需要写很多代码了。我希望将来link可以帮助某人。

答案 7 :(得分:1)

迟到了,但我需要一个可扩展到任何设备并使用此方法的标签。

创建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上全屏显示。 / p>

答案 8 :(得分:1)

以下是我在运行时用于在两种不同字体大小之间切换的函数示例。它根据水平尺寸类决定使用哪种字体 - 这实际上将设备分为两组“iPad”和“iPhone”。以下是对属于哪种大小类的设备的良好引用:http://useyourloaf.com/blog/size-classes/

  • iPad和Up
  • 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
}

答案 9 :(得分:0)

根据您的屏幕截图,我建议使用动态类型。这样用户负责文本的大小。