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

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

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

使用xCode 6.1和我的应用程序支持从iOS 7到最新的iOS 8.1。 我只期待故事板中的解决方案,因为我在故事板中完全完成了我的UI设计。 如果故事板具有有限的function来满足我的需求,请让我知道如何通过应用程序实现相同的代码?

根据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  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中更改您的class级并使用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 } 

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

Interesting Posts