如何使用尺寸类别唯一识别iPhone 6和iPhone 6以及纵向屏幕?
我的应用程序在iPhone 4和iPhone 5中看起来不错,但由于屏幕尺寸的原因,iPhone 6和6中的空白空间相同。虽然使用自动布局,但我不能仅为iPhone 6和6加上单独增加字体大小或视图大小。我知道我们可以使用大小类来改变字体大小和视图大小。但就我而言,我不知道该怎么做。
使用xCode 6.1和我的应用程序支持从iOS 7到最新的iOS 8.1。我希望只在故事板中使用解决方案,因为我在故事板中完全完成了我的UI设计。如果storyboard的功能有限以满足我的需求,请告诉我如何通过应用程序实现相同的代码?
答案 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)
在故事板中使用紧凑宽度和常规高度
通过添加乘数,添加相对于超级视图的高度和宽度的布局约束。 假设您有图像视图,其大小超过超视图的一半,然后添加乘数0.5。
答案 2 :(得分:2)
查看adjustsFontSizeToFitWidth @ UILabel Class Reference。这将允许您根据不同的设备做一些很好的调整。
label.adjustsFontSizeToFitWidth = YES;
答案 3 :(得分:2)
我不太了解不同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];
}
}
}
答案 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)
经过艰苦的努力,我发现了一些适合自己需要的东西,所以为未来的读者发布了相同内容。
编辑 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/
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)
根据您的屏幕截图,我建议使用动态类型。这样用户负责文本的大小。