用尺寸等级区分 iphone 4 vs 5 vs 6 vs 6+ 肖像

Posted

技术标签:

【中文标题】用尺寸等级区分 iphone 4 vs 5 vs 6 vs 6+ 肖像【英文标题】:Distinguish iphone 4 vs 5 vs 6 vs 6+ portrait with size class 【发布时间】:2015-03-13 20:11:33 【问题描述】:

我为每种设备设计了不同的偏移量和元素大小。 有没有什么方法可以为不同的 iphone 纵向设置不同的值到故事板中的约束(使用大小类或其他)?

如果不是 - 解决此类任务的最佳方法是什么?

更新

例如,我有徽标,每个(包括不同的 iphone)平台上徽标的顶部偏移量不同(甚至以点为单位)。

我想避免这样的代码

- (CGFloat)topLogoConstraintAccordingToSize:(CGSize)size 
    CGFloat top = 0;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
        if (size.height > size.width)
            top = 56;
         else 
            top = 35;
        
     else 
        if (IS_IPHONE_4)
            top = 36;
         else if (IS_IPHONE_5)
            top = 22;
         else if (IS_IPHONE_6)
            top = 50;
         else if (IS_IPHONE_6_PLUS)
            top = 56;
        
    
    return top;

//宇宙的其他地方

self.logoTopConstraint.constant = [self topLogoConstraintAccordingToSize:size];

我也不想为每个平台创建单独的故事板——这更糟。

【问题讨论】:

除了这两个建议的解决方案之外,也许您可​​以创建带有偏移量的徽标(几张不同的图片)并通过代码分配带有设备名称的徽标(如果您问我,这很难看) .第四种解决方案可能是:不可能。 【参考方案1】:

您可以将约束与后面的代码连接起来,并根据需要更改值。

这可能看起来像: - 在 .h 文件中:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *constraint;

-在.m文件中:

if ([platform isEqualToString:@"iPhone3,3"])    constraint.constant=1;//put value you want instead of 1,2 and 3
if ([platform isEqualToString:@"iPhone4,1"])    constraint.constant=1;
if ([platform isEqualToString:@"iPhone5,1"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone5,2"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone5,3"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone5,4"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone6,1"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone6,2"])    constraint.constant=2;
if ([platform isEqualToString:@"iPhone7,1"])    constraint.constant=3;
if ([platform isEqualToString:@"iPhone7,2"])    constraint.constant=3;

但是,我不确定您要达到什么目标。每个元素都以点为单位,应该看起来不错(1x、2x 和 3x)。你能解释一下你想做什么吗?

【讨论】:

【参考方案2】:

将此行粘贴到 AppDelegate.m 中的标题下方

 #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:(v) options:NSNumericSearch] != NSOrderedAscending)
 #define IS_WIDESCREEN ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

并在应用程序中启动

       UIStoryboard *mainStoryboard = nil;
      if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0"))
   


    if (IS_WIDESCREEN)
    

        //4 inch screen
        mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];


    
    else
    

        if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPad)
        
            mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];

        
        else
        
            //3.5 inch screen
            mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_legacy_IPhone" bundle:nil];
        
    
 

【讨论】:

这与约束无关,因此答案与问题无关【参考方案3】:

如果您以编程方式执行此操作,则可以针对屏幕高度(或宽度)进行测试,例如:

//iphone 5
if UIScreen.main.bounds.size.height == 568.0 
// your code here

iphone屏幕高度如下:

iphone 5 = 568.0

iPhone 6/6s/7 = 667.0

iphone 6/7 plus = 736.0

【讨论】:

以上是关于用尺寸等级区分 iphone 4 vs 5 vs 6 vs 6+ 肖像的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用尺寸等级和情节提要的情况下创建适用于 iPhone 4 到 iPhone 6 Plus 的 XIB?

Iphone 和 Ipad 的尺寸等级设计

vs code不同后缀的文件按图标区分,如.vue .md

iPhone 6s Plus 在横向具有紧凑的水平尺寸等级

如何在 iphone5 和 iphone6 上更改 UIImageView 的大小?

VS2010 framework3.5 新建的类库无法添加服务引用,没有那个选项,求达人指点 全分求指教