【问题标题】:iOS different constraints for different devicesiOS针对不同设备的不同约束
【发布时间】:2018-07-16 23:46:39
【问题描述】:

我有一个专为 iPhone SE 设计的 ViewController

如你所见,我也有一个约束Align Top to: Safe Area Equals 75

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

  • SE = 75
  • 8 = 85
  • 8 加 = 105

【问题讨论】:

  • 你可以考虑另一种约束;将正方形的底部约束到超级视图的中心。
  • 嗯,它可以提供帮助。我会试试看。谢谢
  • 如果你真的需要这样做,那么约束就是办法。但是 2 提示 1. 尝试使用readableContentGuide。我知道这不会为你带来任何改变。只是苹果在广泛研究的基础上获得了这些价值观。你不应该有一个需要这样的设计2。尝试将其限制在顶部,然后修改其contentcompressionresistancepriority 与其他视图。还有here

标签: ios xcode size-classes


【解决方案1】:

简单的方法!

为了克服这个问题,我创建了一个小的 library,这样您就不必编写一行代码,只需将类 (NSLayoutHelper) 分配给您的约束,您就可以更新所有的约束设备不同。

用于更新约束

输出

【讨论】:

  • 谢谢。总有一天会试试的:)
  • 嘿@Catalin 你的意思是说一个不支持通用设备的应用程序吗?我只是在仅支持 iPhone 的情况下对此进行了测试,在这种情况下,它正在使用 4.7 英寸设备。工作正常。
  • @FredericoRossini,您的反馈意义重大,感谢您的尝试。
  • 你的图书馆很棒。感谢您与我们分享
  • 干得好兄弟。请更新 repo 中的设备列表。
【解决方案2】:

我们面临着类似的问题。我们使用名为 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

【讨论】:

  • 好的,随意玩乘数:)
【解决方案3】:

不使用 Interface Builder,不。约束,只能针对 Compact、Regular 或 Any 尺寸,并且所有 iPhone 型号在纵向模式下都具有 Compact 宽度和 Regular 高度。

如果你想要那种粒度,你必须用代码来代替。

【讨论】:

  • 感谢您的回答。例如,当我在 SE 上拥有一个 ViewController 完美外观并且在 iPhone 8 Plus 上拥有太多空白空间时,你能写下你的想法吗?我需要更改代码中的约束吗?
  • 是的。为您的约束创建一个出口并将其常量更改为您想要的值,具体取决于您的视图控制器视图的大小(或设备屏幕大小)。
【解决方案4】:

这在 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
   }

}

【讨论】:

  • 谢谢你的回答,你能告诉我这是否是 iOS 的正常做法?
  • 当然,这是 Apple 为您提到的问题创建尺寸等级之前的唯一方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多