web-dev-qa-db-ja.com

デバイスごとに異なるiOS制約

IPhone SE用に設計されたViewControllerを持っています

enter image description here

ご覧のとおり、私には制約もありますAlign Top to: Safe Area Equals 75

問題は、iPhone 8とiPhone 8 Plusでこの値を変更することは可能ですか?例えば:

  • SE = 75
  • 8 = 85
  • 8プラス= 105
10
xskit

私たちは同様の問題に直面していました。私たちは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
4
Jakub Průša

簡単な方法!

この問題を克服するために、小さな library を作成したので、1行のコードを記述する必要はなく、クラス(NSLayoutHelper)を制約に割り当てるだけで、制約を更新できますすべてのデバイスが異なります。

enter image description here

制約の更新用

enter image description here

出力

enter image description here

7
dreamBegin

Interface Builderを使用していません。制約は、コンパクト、レギュラー、または任意のサイズのみをターゲットにすることができ、すべてのiPhoneモデルは、縦長モードのときにコンパクト幅とレギュラー高さを持ちます。

この種の細分性が必要な場合は、代わりにコードで行う必要があります。

6
andlin

これは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
   }

}
2
Sh_Khan