如何在 ios 中适应不同的屏幕尺寸
How to fit different screen sizes in ios
我知道这个问题似乎是一个老派问题,但我找不到很好的答案,有件事:
iPhone5、iPhone6 和 iPhone6+ 的逻辑屏幕分辨率:
iPhone5 320 x 568
iPhone6 375 x 667
iPhone6+ 414 x 736
假设我在屏幕中央有一个正方形 UI 元素,并且有三种方法可以在不同的设备上限制它的宽度(&高度):
width
不变
width/screen.width
不变
screen.width - width
不变
这三种不同的约束方式导致三种不同的外观:
Picture 1: 3 different appearances
我认为第二种约束方式(即 Picture 1
中的中间列)从设计师的角度来看是最自然的,但从程序员的角度来看是最不自然的。我需要检查设备类型并计算尺寸并为不同的设备使用不同的图像(自动布局在这种情况下无济于事)
第一种方式实施起来似乎很自然,但在实践中却很糟糕,尤其是在处理文本字体大小时。
第三个还需要通过编程判断使用哪个图像,因为三个UI元素在三个不同的设备中不匹配简单的@x2
@x3
比例因子。
是否有任何解决方法可以轻松实现第二种约束方式?
如果ViewController,您可以只在容器中水平和垂直在容器中给出约束以查看哪个在中心,如果需要则给出视图本身的高度和宽度。
如果您使用故事板,您可以轻松计算出您想要的第二种方式。您可以使用超级视图提供比例宽度。
正如您在 image 中看到的
你可以让你的观点倍增。
或者您可以在代码中创建宽度约束,例如:
@IBOutlet weak var widthConstraint: NSLayoutConstraint!
您可以在代码中更新约束。
使用宏的
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
if(IS_PHONE_5){//TODO}
if(IS_PHONE_6){//TODO}
我知道这个问题似乎是一个老派问题,但我找不到很好的答案,有件事:
iPhone5、iPhone6 和 iPhone6+ 的逻辑屏幕分辨率:
iPhone5 320 x 568
iPhone6 375 x 667
iPhone6+ 414 x 736
假设我在屏幕中央有一个正方形 UI 元素,并且有三种方法可以在不同的设备上限制它的宽度(&高度):
width
不变width/screen.width
不变screen.width - width
不变
这三种不同的约束方式导致三种不同的外观:
Picture 1: 3 different appearances
我认为第二种约束方式(即 Picture 1
中的中间列)从设计师的角度来看是最自然的,但从程序员的角度来看是最不自然的。我需要检查设备类型并计算尺寸并为不同的设备使用不同的图像(自动布局在这种情况下无济于事)
第一种方式实施起来似乎很自然,但在实践中却很糟糕,尤其是在处理文本字体大小时。
第三个还需要通过编程判断使用哪个图像,因为三个UI元素在三个不同的设备中不匹配简单的@x2
@x3
比例因子。
是否有任何解决方法可以轻松实现第二种约束方式?
如果ViewController,您可以只在容器中水平和垂直在容器中给出约束以查看哪个在中心,如果需要则给出视图本身的高度和宽度。
如果您使用故事板,您可以轻松计算出您想要的第二种方式。您可以使用超级视图提供比例宽度。 正如您在 image 中看到的 你可以让你的观点倍增。 或者您可以在代码中创建宽度约束,例如:
@IBOutlet weak var widthConstraint: NSLayoutConstraint!
您可以在代码中更新约束。
使用宏的
#define IS_IPAD (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_IPHONE (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
#define IS_RETINA ([[UIScreen mainScreen] scale] >= 2.0)
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)
#define SCREEN_MAX_LENGTH (MAX(SCREEN_WIDTH, SCREEN_HEIGHT))
#define SCREEN_MIN_LENGTH (MIN(SCREEN_WIDTH, SCREEN_HEIGHT))
#define IS_IPHONE_4_OR_LESS (IS_IPHONE && SCREEN_MAX_LENGTH < 568.0)
#define IS_IPHONE_5 (IS_IPHONE && SCREEN_MAX_LENGTH == 568.0)
#define IS_IPHONE_6 (IS_IPHONE && SCREEN_MAX_LENGTH == 667.0)
#define IS_IPHONE_6P (IS_IPHONE && SCREEN_MAX_LENGTH == 736.0)
if(IS_PHONE_5){//TODO}
if(IS_PHONE_6){//TODO}