Ios 加载后具有不同大小的UIButton

Ios 加载后具有不同大小的UIButton,ios,swift,uibutton,gradient,Ios,Swift,Uibutton,Gradient,嗨,我想把一个渐变背景放在一个按钮里。这是我的方法,但对于iPhone7 plus或8 plus,它并没有覆盖所有按钮。当a看到uibutton框架(174.5,0.0,164.5,47.0),但在加载后,我可以看到它是(194.5,0.0,184.5,47.0)。看起来像这样 设置@IBOutlet时,视图的帧不正确。我建议您进一步了解UIViewController lifecycle以了解此问题 正确的解决方案是调用setRedGradiant获取viewWillLayoutSubvie

嗨,我想把一个渐变背景放在一个按钮里。这是我的方法,但对于iPhone7 plus或8 plus,它并没有覆盖所有按钮。当a看到uibutton框架(174.5,0.0,164.5,47.0),但在加载后,我可以看到它是(194.5,0.0,184.5,47.0)。看起来像这样


设置
@IBOutlet
时,
视图的帧不正确。我建议您进一步了解
UIViewController lifecycle
以了解此问题

正确的解决方案是调用
setRedGradiant
获取
viewWillLayoutSubviews
方法上的相应按钮


每次更改视图边界时都会调用此函数。

设置
@IBOutlet
时,
视图的帧不正确。我建议您进一步了解
UIViewController lifecycle
以了解此问题

正确的解决方案是调用
setRedGradiant
获取
viewWillLayoutSubviews
方法上的相应按钮


每次更改视图边界时都会调用此函数。

在确定按钮大小后,需要设置渐变的帧。一种简便的方法是创建
UIButton
的子类,并覆盖
layoutSubviews
以设置渐变

layoutSubviews()
将在按钮的帧发生更改时被调用,但您只需要在第一次设置渐变。使用属性存储渐变,以便在以后调用时更新

class GradientButton: UIButton {

    var gradient: CAGradientLayer?

    override func layoutSubviews() {
        super.layoutSubviews()
        setRedGradient()
    }

    func setRedGradient() {
        if gradient == nil {
            self.layer.shadowOffset = CGSize.zero
            self.layer.shadowColor = UIColor(red:0, green:0, blue:0, alpha:0.5).cgColor
            self.layer.shadowOpacity = 1
            self.layer.shadowRadius = 4
            self.gradient = CAGradientLayer()

            self.gradient?.colors = [
                UIColor(red:0.97, green:0.34, blue:0.39, alpha:1).cgColor,
                UIColor(red:0.94, green:0.17, blue:0.2, alpha:1).cgColor
            ]
            self.gradient?.locations = [0, 1]
            self.gradient?.startPoint = CGPoint(x: 0.5, y: 0)
            self.gradient?.endPoint = CGPoint(x: 0.5, y: 1)

            self.layer.addSublayer(self.gradient!)
        }

        // Always update the frame, even if this isn't the first call
        self.gradient?.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height)
        self.gradient?.cornerRadius = self.frame.size.height / 2
    }
}
要在故事板中使用此选项,请在Identity Inspector中将
UIButton
class
更改为
GradientButton

您的销售渠道变成:

@IBOutlet weak var signInButton: GradientButton!
这样做的好处是,按钮设置并更新自己的渐变,如果你有两个或更多的按钮,这很好


未来的一个改进是将颜色作为属性,这样您就可以拥有更多的红色按钮

按钮大小确定后,需要设置渐变帧。一种简便的方法是创建
UIButton
的子类,并覆盖
layoutSubviews
以设置渐变

layoutSubviews()
将在按钮的帧发生更改时被调用,但您只需要在第一次设置渐变。使用属性存储渐变,以便在以后调用时更新

class GradientButton: UIButton {

    var gradient: CAGradientLayer?

    override func layoutSubviews() {
        super.layoutSubviews()
        setRedGradient()
    }

    func setRedGradient() {
        if gradient == nil {
            self.layer.shadowOffset = CGSize.zero
            self.layer.shadowColor = UIColor(red:0, green:0, blue:0, alpha:0.5).cgColor
            self.layer.shadowOpacity = 1
            self.layer.shadowRadius = 4
            self.gradient = CAGradientLayer()

            self.gradient?.colors = [
                UIColor(red:0.97, green:0.34, blue:0.39, alpha:1).cgColor,
                UIColor(red:0.94, green:0.17, blue:0.2, alpha:1).cgColor
            ]
            self.gradient?.locations = [0, 1]
            self.gradient?.startPoint = CGPoint(x: 0.5, y: 0)
            self.gradient?.endPoint = CGPoint(x: 0.5, y: 1)

            self.layer.addSublayer(self.gradient!)
        }

        // Always update the frame, even if this isn't the first call
        self.gradient?.frame = CGRect(x: 0, y: 0, width: self.frame.size.width, height: self.frame.size.height)
        self.gradient?.cornerRadius = self.frame.size.height / 2
    }
}
要在故事板中使用此选项,请在Identity Inspector中将
UIButton
class
更改为
GradientButton

您的销售渠道变成:

@IBOutlet weak var signInButton: GradientButton!
这样做的好处是,按钮设置并更新自己的渐变,如果你有两个或更多的按钮,这很好


未来的一个改进是将颜色作为属性,这样您就可以拥有更多的红色按钮

我想您应该在
viewDidLoad
调用
signInButton.setRedGradiant()
,也可以在函数处使用
.bounds
而不是
.frame

func setRedGradiant(){
    self.layer.shadowOffset = CGSize.zero
    self.layer.shadowColor = UIColor(red:0, green:0, blue:0, alpha:0.5).cgColor
    self.layer.shadowOpacity = 1
    self.layer.shadowRadius = 4
    let gradient = CAGradientLayer()
    print(self.bounds)
    gradient.frame = CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height)
    gradient.colors = [
        UIColor(red:0.97, green:0.34, blue:0.39, alpha:1).cgColor,
        UIColor(red:0.94, green:0.17, blue:0.2, alpha:1).cgColor
    ]
    gradient.locations = [0, 1]
    gradient.startPoint = CGPoint(x: 0.5, y: 0)
    gradient.endPoint = CGPoint(x: 0.5, y: 1)
    gradient.cornerRadius = self.bounds.size.height / 2
    self.layer.addSublayer(gradient)
}

我想您应该在
viewDidLoad
处调用
signInButton.setRedGradiant()
,也可以在函数处使用
.bounds
而不是
.frame

func setRedGradiant(){
    self.layer.shadowOffset = CGSize.zero
    self.layer.shadowColor = UIColor(red:0, green:0, blue:0, alpha:0.5).cgColor
    self.layer.shadowOpacity = 1
    self.layer.shadowRadius = 4
    let gradient = CAGradientLayer()
    print(self.bounds)
    gradient.frame = CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.bounds.size.height)
    gradient.colors = [
        UIColor(red:0.97, green:0.34, blue:0.39, alpha:1).cgColor,
        UIColor(red:0.94, green:0.17, blue:0.2, alpha:1).cgColor
    ]
    gradient.locations = [0, 1]
    gradient.startPoint = CGPoint(x: 0.5, y: 0)
    gradient.endPoint = CGPoint(x: 0.5, y: 1)
    gradient.cornerRadius = self.bounds.size.height / 2
    self.layer.addSublayer(gradient)
}

您正在调用viewDidLoad中的setRedGradiant吗?如果是这种情况,那么它肯定会在故事板上显示框架。您是否在viewDidLoad中调用setRedGradiant?如果是这样的话,那么它肯定会在故事板上显示框架。谢谢你解决了这个问题!!有没有办法在IBOutlet中调用该方法??对于代码顺序,您可以使用屏幕大小计算预期的按钮大小。为此,请致电
UIScreen.main.bounds
。谢谢您解决了问题!!有没有办法在IBOutlet中调用该方法??对于代码顺序,您可以使用屏幕大小计算预期的按钮大小。为此调用
UIScreen.main.bounds
。我以前尝试过使用边界。我认为唯一的选择是在ViewWillLayoutSubViews中调用它。我以前尝试使用bounds。我认为唯一的选择是在viewWillLayoutSubViews中调用它