简体   繁体   中英

Change the value of constraint for only iPhone 4 in IB

How I can change the value of a constraint on only one device. For example, I want to display a button with 400px height for all iPhones except iPhone 4 where I would display it with 300px ?

The best solution is to create new class inherit from NSLayoutConstraint class and add the properties below, like that you will have the possibility to change the constant, the multiplier and also to deactivate the constraint for each device and all this in the interface builder :

在此处输入图片说明

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

您可以使用插座作为约束,并根据运行的设备更改其值。即,如果iphone4则为300px,否则为400px(使用插座的“ constant ”属性)

You can take outlet of height constraint of that button. then you can detect device if it is iphone 4 then you can change it's constraint's outlet's constant something like,

   self.heightConstraint.constant = 300;

For connect outlet of constraint just ctrl + drag from that constraint to class

You can detect device by getting screensize.

if ([ [ UIScreen mainScreen ] bounds ].size.height == 480.00) {

      NSLog(@"this is iphn 4");
      self.heightConstraint.constant = 300;
}

Hope this will help :)

First Create object of button height constraint(btnConstHeight)

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

Swift 4 Version of @Hamza 's answer

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM