自定义按钮在界面生成器中未正确显示

Posted

技术标签:

【中文标题】自定义按钮在界面生成器中未正确显示【英文标题】:Custom button is not showing correctly in Interface Builder 【发布时间】:2018-01-16 12:02:00 【问题描述】:

我正在学习在 XCode 中开发 ios 应用程序。 我创建了应该有红色背景和绿色文本的简单自定义按钮(UIButton 的子类)。在 iOS 模拟器中运行应用程序时,一切正常。但是在界面生成器中使用了其他颜色(在界面生成器中指定)。测试项目可在https://www.dropbox.com/s/ro7i4omdbpwapi0/testapp%20%282%29.zip?dl=0 获得。有人可以帮忙吗?

这里是自定义 UIbutton 类的源代码:

import UIKit

@IBDesignable class DefaultButton: UIButton 
    override init(frame: CGRect) 
        super.init(frame: frame)
        setup()
    

    required init?(coder: NSCoder) 
        super.init(coder: coder)
        setup()
    

    func setup() 
        setTitleColor(UIColor.red, for: .normal)
        backgroundColor = UIColor.green
        //setBackgroundImage(UIImage.createGradient(colors:  [ UIColor.defaultGradientStartColor, UIColor.defaultGradientEndColor ], startPoint: CGPoint(x: 0, y: 0), endPoint: CGPoint(x: 1, y: 0), size: CGSize(width: 200, height: 200)), for: .normal)
        //layer.cornerRadius = 50
    

    override func awakeFromNib() 
        super.awakeFromNib()
        setup()
    

【问题讨论】:

请在您的问题中加入minimal reproducible example。 @the4kman 你下载附件了吗?这是一个不会在 IB 中呈现的自定义按钮类的最小示例。 您应该在问题本身中包含重现问题的代码。 @the4kman 似乎只运行附加项目来查看问题要简单得多。但是好的,我将在帖子中包含 DefaultButton 类的源代码 【参考方案1】:

您回答中描述的行为是正确的;但我认为你混合了两种不同的东西。

基本上,如果您想为按钮标题和按钮背景着色,则必须使用界面生成器中的可用字段。您有一些不错的属性可以轻松设置这些东西。

Use interface builder's parameters to design your look

因此,在这种情况下,在视图设置中定义 titleColorbackgroundColor 并不相关,因为它是硬编码的。

如果您想在情节提要中为按钮显示自定义外观(例如圆角),则可以使用 @IBInspectable 关键字在界面构建器中添加新属性。

@IBDesignable
class DefaultButton: UIButton 

    @IBInspectable var borderWidth: CGFloat = 0 
        didSet 
            layer.borderWidth = borderWidth
        
    
    @IBInspectable var borderColor: UIColor? 
        didSet 
            layer.borderColor = borderColor?.cgColor
        
    
    @IBInspectable var cornerRadius: CGFloat = 0 
        didSet 
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = cornerRadius > 0
        
    

    // ...

通过这样做,您可以在情节提要中编辑并查看带有漂亮渲染的视图!

Custom properties directly in storyboard

【讨论】:

感谢您的回答。因为会有很多相同样式的按钮,所以我不想总是在 IB 中指定这些样式参数。这就是创建自定义 UIButton 类的目的。

以上是关于自定义按钮在界面生成器中未正确显示的主要内容,如果未能解决你的问题,请参考以下文章

界面生成器 UIButton 自定义背景图像在模拟器/设备上不起作用

如何设计WinForm中DataGridView控件的自定义按钮列

将多个自定义栏按钮添加到自定义导航栏

AppBar 自定义顶部导航按钮 图标颜色 以及 TabBar 定义顶部 Tab 切换

使用自定义图像按钮在 UIToolbar 上命中目标不正确

Swift:在自定义视图中未调用 UIButton 触摸事件