繁体   English   中英

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

[英]Size class to identify iPhone 6 and iPhone 6 plus portrait

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

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

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

根据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”属性添加到用户定义的运行时属性列表中(类型为“布尔”并选中复选框)。

对您想要调整的每个标签执行相同操作(复制和粘贴令人惊讶地在这里工作)。

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

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

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

在此输入图像描述

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

label.adjustsFontSizeToFitWidth = YES;

我对不同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];
    }
}
}

Swift版@iBhaviks回答:

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

也许您可以为大屏幕设置完美的字体大小,然后将自动Autoshrink设置为minimum font size ,小屏幕的尺寸完美,这样您就可以拥有动态字体大小而无需编码。

您必须设置标签的约束,无论如何都要根据屏幕大小调整其大小。

希望这有帮助

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

  1. 截至目前,无法使用Size类唯一标识iPhone 6模型肖像。 但是,您可以使用紧凑宽度和常规高度来设计所有iPhone纵向屏幕
  2. 要更改字体大小,您必须使用代码识别当前正在运行的应用程序的iPhone,并根据相同的内容设置字体大小
  3. 根据我的要求 - 所有屏幕尺寸的相同布局 - 使用宽度和高度限制的乘数。 检查Jignesh这个问题的答案,了解更多相关信息。

编辑 24-SEP-2015我最近发现了一种通过仅对iPhone 6 plus使用UITraitColleection来自定义大小等级的方法,因此您不需要编写大量代码。 我希望这个链接将来会帮助别人。

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

创建一个新的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上全屏显示。

下面是一个函数示例,用于在运行时在两个不同的字体大小之间切换。 它根据水平尺寸类决定使用哪种字体 - 这实际上将设备分为两组“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 } 

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM