首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >按钮未完全绘制

按钮未完全绘制
EN

Stack Overflow用户
提问于 2019-09-24 02:20:57
回答 1查看 36关注 0票数 0

我有一个带有文本和图像的按钮。它在viewDidAppear中设置,然后在IBAction中更改属性标题。由于某些原因,按钮背景颜色在初始绘制时不能完全覆盖按钮。它会留下一条水平的白色长条。我发现,通过在IBAction中运行我的formatButton函数,随后按下的按钮会显示一个正确绘制的按钮。但是我不能让按钮的第一个加载视图看起来正确。有什么想法吗?

我发现,通过在IBAction中设置格式,它可以为将来的按钮绘制修复它,但是sendAction(.touchUpInside)甚至不能伪造它来修复绘制问题。(它确实像IBAction一样更改了按钮文本。)

代码语言:javascript
运行
复制
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    formatButton(btn: searchTitlesButton)
    formatButton(btn: searchPeopleButton)
    formatButton(btn: searchCategoryButton)
    searchTitlesButton.setTitle("Title", for: .normal)
    searchPeopleButton.setTitle("Actor", for: .normal)
    //searchCategoryButton.setTitle(categoryList[searchCategoryIndex], for: .normal)

    let fullString = NSMutableAttributedString()
    let imageAttachment = NSTextAttachment()
    imageAttachment.image = UIImage(named:"DownArrow")
    let imageString = NSAttributedString(attachment: imageAttachment)
    fullString.append(NSAttributedString(string: categoryList[searchCategoryIndex]+"   "))
    fullString.append(imageString)
    searchCategoryButton.setAttributedTitle(fullString, for: .normal)

    formatButton(btn: searchCategoryButton)

    postTableView.rowHeight = CGFloat(120)
}

@IBAction func searchCategoryButton(_ sender: Any) {
    if searchCategoryIndex < categoryList.count - 1 {
        searchCategoryIndex += 1
    } else {
        searchCategoryIndex = 0
    }
    // Going to try and make a formatted label with a string and image of a down arrow.
    let fullString = NSMutableAttributedString()
    let imageAttachment = NSTextAttachment()
    imageAttachment.image = UIImage(named:"DownArrow")
    let imageString = NSAttributedString(attachment: imageAttachment)
    fullString.append(NSAttributedString(string: categoryList[searchCategoryIndex]+"   "))
    fullString.append(imageString)
    searchCategoryButton.setAttributedTitle(fullString, for: .normal)
    formatButton(btn: searchCategoryButton)
}

func formatButton(btn:UIButton) {

    btn.layer.cornerRadius = 5
    btn.layer.borderWidth = 1
    btn.layer.borderColor = UIColor.black.cgColor
    btn.setTitleColor(UIColor.white, for: .normal)
    btn.titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.bold)

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = btn.bounds
    let bottomColor = UIColor(red: CGFloat(25/255.0), green: CGFloat(113/255.0), blue: CGFloat(255/255.0), alpha: CGFloat(1.0))
    gradientLayer.colors = [UIColor.white.cgColor, bottomColor.cgColor]
    btn.layer.insertSublayer(gradientLayer, at: 0)
    btn.clipsToBounds = true
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-24 04:43:33

背景渐变没有完全覆盖按钮的原因,可能是因为按钮的大小在设置属性标题时发生了变化。解决这个问题的最好方法是创建一个UIButton的子类,这样当按钮的边界改变时,你就可以更新你的自定义渐变层的框架。例如:

代码语言:javascript
运行
复制
class GradientButton: UIButton {

    private let gradientLayer = CAGradientLayer()

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    private func setup() {
        layer.cornerRadius = 5
        layer.borderWidth = 1
        layer.borderColor = UIColor.black.cgColor
        setTitleColor(UIColor.white, for: .normal)
        titleLabel?.font = UIFont.systemFont(ofSize: 14, weight: UIFont.Weight.bold)
        let bottomColor = UIColor(red: CGFloat(25/255.0), green: CGFloat(113/255.0), blue: CGFloat(255/255.0), alpha: CGFloat(1.0))
        gradientLayer.colors = [UIColor.white.cgColor, bottomColor.cgColor]
        layer.insertSublayer(gradientLayer, at: 0)
        clipsToBounds = true
    }

    override var bounds: CGRect {
        didSet {
            gradientLayer.frame = layer.bounds
        }
    }
}

然后,在nib的情节提要中,您可以将按钮的类更改为GradientButton。它现在应该自动应用渐变样式,并在按钮的边界发生变化时更新框架。

我希望这对你有用。如果您仍然有问题,请让我知道。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58068111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档