iOS对不同设备有不同的限制

iOS对不同设备有不同的限制,ios,xcode,size-classes,Ios,Xcode,Size Classes,我有一个为iPhone SE设计的ViewController 如您所见,我还有一个约束条件Align Top to:Safe Area=75 问题是,是否可以更改iPhone 8和iPhone 8 Plus的此值?例如: SE=75 8=85 8加=105 不使用Interface Builder,没有限制,只能针对紧凑型、常规型或任何尺寸,所有iPhone型号在纵向模式下都具有紧凑的宽度和常规的高度 如果需要这种粒度,则必须使用代码。这不适用于IB,您可以通过将视图的顶部约束挂接为IBO

我有一个为iPhone SE设计的ViewController

如您所见,我还有一个约束条件
Align Top to:Safe Area=75

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

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

    • 不使用Interface Builder,没有限制,只能针对紧凑型、常规型或任何尺寸,所有iPhone型号在纵向模式下都具有紧凑的宽度和常规的高度


      如果需要这种粒度,则必须使用代码。

      这不适用于IB,您可以通过将视图的顶部约束挂接为IBOutlet和ViewDidLayoutSubview来尝试在代码中使用

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

      我们也面临着类似的问题。我们使用名为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
      
      简单的方法! 为了解决这个问题,我创建了一个小型的应用程序,这样您就不必编写一行代码,只需将类(NSLayoutHelper)分配给您的约束,您就可以以不同的方式更新所有设备的约束

      用于更新约束

      输出


      你可以考虑另一种约束;将正方形底部约束到superview的中心。嗯,这会有所帮助。我试试看。谢谢如果你真的需要这样做,那么约束就是方法。尝试使用。我知道这不会给你带来任何改变。只有苹果公司在广泛研究的基础上得出了这些价值观。你不应该有这样的设计。尝试将其约束到顶部,然后修改其与其他视图的对比。也谢谢你的回答。例如,当我在SE上有一个完美的ViewController外观,在iPhone8Plus上有太多的空白空间时,你能写下你的想法吗?我需要更改代码中的约束吗?需要。根据viewcontroller视图的大小(或设备屏幕大小),为您的约束创建一个出口,并将其常量更改为您想要的值。谢谢您的回答,您能告诉我这是否是iOS的正常做法吗?当然,这是唯一的方法,直到苹果为你提到的问题创建大小类OK,请随意使用乘数:)谢谢。有一天会尝试:)嘿@Catalin你是说一个不支持通用设备的应用程序吗?我只是在iPhone支持的情况下测试了这一点,在这种情况下,它选择了4.7英寸的设备。工作很好。@FredericoRossini和你的反馈非常重要,谢谢你的尝试。你的图书馆太棒了。谢谢与我们分享谢谢:)@EminTurk