iOS不同设备上的不同约束条件

18

我有一个为iPhone SE设计的ViewController

enter image description here

正如您所看到的,我还有一个约束条件Align Top to: Safe Area Equals 75

问题是,是否可以针对iPhone 8和iPhone 8 Plus更改此值?例如:

  • SE = 75
  • 8 = 85
  • 8 Plus = 105

1
你可以考虑另一种约束方式;将正方形底部约束到父视图中心。 - Paulw11
嗯,这很有帮助。我会试一下的。谢谢。 - xskit
1
如果你真的需要这样做,那么约束就是方法。然而有两个提示:1. 尝试使用readableContentGuide。我知道这对你来说不会有任何改变。只是苹果根据广泛的研究得出了这些值。你不应该有一个需要这样的设计。2. 尝试将其约束到顶部,但然后修改其 contentcompressionresistancepriority 与其他视图的优先级。此外,在这里 - mfaani
4个回答

23

轻松易懂的方法!

为了解决这个问题,我创建了一个小的,因此您不必编写一行代码,只需将类(NSLayoutHelper)分配给您的约束即可在所有设备上以不同的方式更新约束。

输入图像描述

用于更新约束

输入图像描述

输出

输入图像描述


1
谢谢。有一天会尝试的 :) - xskit
嘿,@Catalin,你是不是想说一个不支持通用设备的应用程序?我刚刚测试了只支持iPhone的情况,在这种情况下它可以识别4.7英寸的设备。工作正常。 - tryKuldeepTanwar
你的库非常棒。感谢与我们分享。 - Emin Turk
干得好兄弟。请在代码库中更新设备列表。 - Lal Krishna
@tryKuldeepTanwar,这太不可思议了!朋友,你的工作太棒了!!! - Michael Szabo
显示剩余2条评论

10

我们遇到了类似的问题。我们使用一个叫做scaled的帮助类解决了这个问题。它基本上只是将某些东西的尺寸乘以一个倍数,这样在较大的设备上看起来更大。

extension CGFloat {
    public var scaled: CGFloat {
        switch UIDevice.type.getResolutionGroup()! {
        case .lr320x568:
            return self
        case .lr375x667:
            return self * 1.1
        case .lr414x736:
            return self * 1.2
        case .lr768x1024:
            return self * 1.3
        // For iPads
        case .lr1024x1366:
            return self * 1.3
        }
    }
}

实施决议组

public func getResolutionGroup() -> ResolutionGroup? {
        switch self {
        case .iPhone5, .iPhone5C, .iPhone5S, .iPhoneSE, .iPodTouch5, .iPodTouch6:
            return .lr320x568
        case .iPhone6, .iPhone6S, .iPhone7:
            return .lr375x667
        case .iPhone6Plus, .iPhone6SPlus, .iPhone7Plus:
            return .lr414x736
        case .iPadMini, .iPadMini2, .iPadMini3, .iPadMini4:
            return .lr768x1024
        case .iPad2, .iPad3, .iPad4, .iPadAir, .iPadAir2:
            return .lr768x1024
        case .iPadPro:
            return .lr1024x1366
        case .simulator:
            return isiPhone() ? .lr320x568 : .lr768x1024
        default:
            return .lr320x568
        }
    }

并在应用程序中使用

fileprivate let footerHeight = CGFloat(180).scaled

1
好的,随意尝试使用乘数 :) - Jakub Průša

8
不使用Interface Builder,约束只能针对紧凑、常规或任何大小,而且所有iPhone模型在纵向模式下宽度都是紧凑的,高度是常规的。
如果您想要这种精细控制,您必须使用代码来实现。

谢谢你的答案。请问你能否提供你的看法,当我在SE上使用ViewController时,它的外观非常完美,但在iPhone 8 Plus上有太多的空白空间。我需要在代码中更改约束吗? - xskit
3
好的。根据您所在的视图控制器视图的大小(或设备屏幕大小),创建用于释放约束并将其常数更改为所需值的出口。 - rodskagg

2
这在IB中不适用,您可以通过将视图的顶部约束作为IBOutlet挂钩到代码中,并在viewDidLayoutSubviews中尝试。
override func viewDidLayoutSubviews()
{

   if(deviceWidthSE)
   {      
      self.viewTopCon.constant = 75
   }
   else
   if(deviceWidth8)
   {
      self.viewTopCon.constant = 85
   }
   else
   if(deviceWidth8Plus)
   {
      self.viewTopCon.constant = 105
   }

}

1
谢谢您的回答,能否告诉我这是否是iOS的正常做法? - xskit
1
当然,这是唯一的方法,直到苹果为您提到的问题创建大小类。 - Shehata Gamal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接