【问题标题】:Change the value of constraint for only iPhone 4 in IB在 IB 中仅更改 iPhone 4 的约束值
【发布时间】:2016-05-24 10:45:43
【问题描述】:

如何仅在一台设备上更改约束值。 例如,我想为除 iPhone 4 之外的所有 iPhone 显示一个高度为 400px 的按钮,我会以 300px 显示它?

【问题讨论】:

    标签: ios xcode swift autolayout


    【解决方案1】:

    最好的解决方案是创建一个继承自 NSLayoutConstraint 类的新类并添加下面的属性,这样您就可以更改常量、乘数以及停用每个设备的约束以及所有这些在界面构建器中

    import UIKit
    
    /**
     * This class used to modify easly the constraint for each device iPhone 4, iPhone 5, iPhone 6 or iPhone 6 Plus
     * You can modify the constant, the multiplier and also active / deactive the constraint for each device
     * You should modify this properties only in the storyboard
     */
    @IBDesignable
    public class LayoutConstraint: NSLayoutConstraint {
    
        // MARK: ?3¨5
    
        /**
         * The constant for device with 3.5 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?3¨5_const: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 480 {
                    constant = ?3¨5_const
                }
            }
        }
    
        /**
         * The multiplier for device with 3.5 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?3¨5_multip: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 480 {
                    self.setValue(?3¨5_multip, forKey: "multiplier")
                }
            }
        }
    
        /**
         * The boolean to active deative constraint for device with 3.5 insh size
         * The default value is true.
         */
        @IBInspectable
        public var ?3¨5_active: Bool = true {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 480 {
                    active = ?3¨5_active
                }
            }
        }
    
        // MARK: ?4¨0
    
        /**
         * The constant for device with 4.0 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?4¨0_const: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 568 {
                    constant = ?4¨0_const
                }
            }
        }
    
        /**
         * The multiplier for device with 4.0 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?4¨0_multip: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 568 {
                    self.setValue(?4¨0_multip, forKey: "multiplier")
                }
            }
        }
    
        /**
         * The boolean to active deative constraint for device with 4.0 insh size
         * The default value is true.
         */
        @IBInspectable
        public var ?4¨0_active: Bool = true {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 568 {
                    active = ?4¨0_active
                }
            }
        }
    
        // MARK: ?4¨7
    
        /**
         * The constant for device with 4.7 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?4¨7_const: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 667 {
                    constant = ?4¨7_const
                }
            }
        }
    
        /**
         * The multiplier for device with 4.7 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?4¨7_multip: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 667 {
                    self.setValue(?4¨7_multip, forKey: "multiplier")
                }
            }
        }
    
        /**
         * The boolean to active deative constraint for device with 4.7 insh size
         * The default value is true.
         */
        @IBInspectable
        public var ?4¨7_active: Bool = true {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 667 {
                    active = ?4¨7_active
                }
            }
        }
        // MARK: ?5¨5
    
        /**
         * The constant for device with 5.5 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?5¨5_const: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 736 {
                    constant = ?5¨5_const
                }
            }
        }
    
        /**
         * The multiplier for device with 5.5 insh size
         * The default value is the value of the constant of the constraint.
         */
        @IBInspectable
        public var ?5¨5_multip: CGFloat = 0 {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 736 {
                    self.setValue(?5¨5_multip, forKey: "multiplier")
                }
            }
        }
    
        /**
         * The boolean to active / deactive constraint for device with 5.5 insh size
         * The default value is true.
         */
        @IBInspectable
        public var ?5¨5_active: Bool = true {
            didSet {
                if CGRectGetMaxY(UIScreen.mainScreen().bounds) == 736 {
                    active = ?5¨5_active
                }
            }
        }
    }
    

    【讨论】:

    • @HamzaGhazouani 当我们更改 IB 中的值时它会自动更新吗?
    • @BadhanGanesh 当你更改 IB 中的值时,你应该运行项目来查看结果
    【解决方案2】:

    您可以为您的约束设置插座并根据您正在运行的设备更改其值。即如果是 iphone4,则为 300 像素,否则为 400 像素,使用插座的“constant”属性

    【讨论】:

      【解决方案3】:

      您可以取消该按钮的高度限制。然后你可以检测设备是否是 iphone 4 然后你可以改变它的约束插座的constant 之类的东西,

         self.heightConstraint.constant = 300;
      

      仅用于连接约束出口ctrl + drag from that constraint to class

      您可以通过获取屏幕大小来检测设备。

      if ([ [ UIScreen mainScreen ] bounds ].size.height == 480.00) {
      
            NSLog(@"this is iphn 4");
            self.heightConstraint.constant = 300;
      }
      

      希望这会有所帮助:)

      【讨论】:

        【解决方案4】:

        首先创建按钮高度约束的对象(btnConstHeight)

        if ([ [ UIScreen mainScreen ] bounds ].size.height == 480.00) {
            self.btnConstHeight.constant = 300;
        }
        else{
            self.btnConstHeight.constant = 400;
        }
        

        【讨论】:

          【解决方案5】:

          @Hamza 答案的 Swift 4 版本

          import Foundation
          
          import UIKit
          
          /**
           * This class used to modify easly the constraint for each device iPhone 4, iPhone 5, iPhone 6 or iPhone 6 Plus
           * You can modify the constant, the multiplier and also active / deactive the constraint for each device
           * You should modify this properties only in the storyboard
           */
          @IBDesignable
          public class LayoutConstraint: NSLayoutConstraint {
          
              // MARK: ?3¨5
          
              /**
               * The constant for device with 3.5 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?3¨5_const: CGFloat = 0 {
                  didSet {
          
                      if UIScreen.main.bounds.maxY == 480 {
                          constant = ?3¨5_const
                      }
                  }
              }
          
              /**
               * The multiplier for device with 3.5 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?3¨5_multip: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 480 {
                          self.setValue(?3¨5_multip, forKey: "multiplier")
                      }
                  }
              }
          
              /**
               * The boolean to active deative constraint for device with 3.5 insh size
               * The default value is true.
               */
              @IBInspectable
              public var ?3¨5_active: Bool = true {
                  didSet {
                      if UIScreen.main.bounds.maxY == 480 {
                          isActive = ?3¨5_active
                      }
                  }
              }
          
              // MARK: ?4¨0
          
              /**
               * The constant for device with 4.0 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?4¨0_const: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 568 {
                          constant = ?4¨0_const
                      }
                  }
              }
          
              /**
               * The multiplier for device with 4.0 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?4¨0_multip: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 568 {
                          self.setValue(?4¨0_multip, forKey: "multiplier")
                      }
                  }
              }
          
              /**
               * The boolean to active deative constraint for device with 4.0 insh size
               * The default value is true.
               */
              @IBInspectable
              public var ?4¨0_active: Bool = true {
                  didSet {
                      if UIScreen.main.bounds.maxY == 568 {
                          isActive = ?4¨0_active
                      }
                  }
              }
          
              // MARK: ?4¨7
          
              /**
               * The constant for device with 4.7 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?4¨7_const: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 667 {
                          constant = ?4¨7_const
                      }
                  }
              }
          
              /**
               * The multiplier for device with 4.7 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?4¨7_multip: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 667 {
                          self.setValue(?4¨7_multip, forKey: "multiplier")
                      }
                  }
              }
          
              /**
               * The boolean to active deative constraint for device with 4.7 insh size
               * The default value is true.
               */
              @IBInspectable
              public var ?4¨7_active: Bool = true {
                  didSet {
                      if UIScreen.main.bounds.maxY == 667 {
                          isActive = ?4¨7_active
                      }
                  }
              }
              // MARK: ?5¨5
          
              /**
               * The constant for device with 5.5 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?5¨5_const: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 736 {
                          constant = ?5¨5_const
                      }
                  }
              }
          
              /**
               * The multiplier for device with 5.5 insh size
               * The default value is the value of the constant of the constraint.
               */
              @IBInspectable
              public var ?5¨5_multip: CGFloat = 0 {
                  didSet {
                      if UIScreen.main.bounds.maxY == 736 {
                          self.setValue(?5¨5_multip, forKey: "multiplier")
                      }
                  }
              }
          
              /**
               * The boolean to active / deactive constraint for device with 5.5 insh size
               * The default value is true.
               */
              @IBInspectable
              public var ?5¨5_active: Bool = true {
                  didSet {
                      if UIScreen.main.bounds.maxY == 736 {
                          isActive = ?5¨5_active
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-02-14
            • 2015-08-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多