iOS different constraints for different devices

前端 未结 4 1423
星月不相逢
星月不相逢 2020-12-16 16:34

I have a ViewController designed for iPhone SE

As you can see I also have a constraint Align Top to: Safe Area Equals 75

The question i

相关标签:
4条回答
  • 2020-12-16 17:09

    Easy way!

    To overcome this issue I created a small library so you don't have to write a single line of code just assign the class (NSLayoutHelper) to your constraint and you'll be able to update your constraint for all the devices differently.

    For updating constraints

    Output

    0 讨论(0)
  • 2020-12-16 17:14

    we were facing similar issue. We solved with helper class called scaled. Which basically just multiply size of something, which should appear larger on larger device.

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

    And implementation of resolution group

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

    And usage in app

    fileprivate let footerHeight = CGFloat(180).scaled
    
    0 讨论(0)
  • 2020-12-16 17:14

    Not using Interface Builder, no. Constraints, can only target Compact, Regular or Any sizes and all iPhone models have Compact width and Regular height when in portrait mode.

    If you want that kind of granularity, you have to do it with code instead.

    0 讨论(0)
  • 2020-12-16 17:16

    This is not applicanle in IB , you can try in code by hooking the top constraint of the view as IBOutlet and in viewDidLayoutSubviews

    override func viewDidLayoutSubviews()
    {
    
       if(deviceWidthSE)
       {      
          self.viewTopCon.constant = 75
       }
       else
       if(deviceWidth8)
       {
          self.viewTopCon.constant = 85
       }
       else
       if(deviceWidth8Plus)
       {
          self.viewTopCon.constant = 105
       }
    
    }
    
    0 讨论(0)
提交回复
热议问题