【问题标题】:UIButton .setImage() doesn't work in Swift 3UIButton .setImage() 在 Swift 3 中不起作用
【发布时间】:2018-01-13 02:40:16
【问题描述】:

我正在尝试将多个按钮添加到 UIView 子类。在UIView 子类(称为leftPanel)的init() 方法中,我添加了对不同函数的多个调用以添加每个按钮。这就是我的init() 的样子:

override init(frame: CGRect){
    super.init(frame: frame)
    components = self.setupView()
    print("Checkpoint: [leftPanel] init() call finished") // basic debug checkpoint
}

init() 调用名为setupView() 的函数,其中包含对创建按钮的每个函数的调用。这是我的setupView() 代码:

func setupView() -> [UIView] {
    let addButton = self.setupAddButton()
    let infoButton = self.setupInfoButton()
    let orderPromoteButton = self.setupOrderPromoteButton()
    let orderDemoteButton = self.setupOrderDemoteButton()
    let refreshItemsButton = self.setupRefreshItemsButton()

    let components = [lessonActionsLabel, addButton, infoButton, orderPromoteButton, orderDemoteButton, refreshItemsButton]
    return components
}

setupView 函数中的每个调用都指向一个较小的函数,该函数包含将每个按钮添加到 leftPanel 子类的代码。我已经这样做了,所以我可以根据需要删除每个成员,并且可以使用每个单独的设置功能根据需要将每个单独的项目重新添加到我的视图中。大部分功能都差不多,使用这段代码:

func setupRefreshItemsButton() -> UIButton {
    let refreshItemsButton = UIButton(type: UIButtonType.infoLight)
    refreshItemsButton.frame = CGRect(x:0, y:screenHeight*55/100, width: screenWidth*30/100, height: screenHeight*5/100)
    refreshItemsButton.setTitle("  Refresh lesson items", for: UIControlState.normal)
    refreshItemsButton.setImage(UIImage(contentsOfFile: "up.png"), for: UIControlState.normal)
    self.addSubview(refreshItemsButton)
    return refreshItemsButton
}

设置每个按钮。但是,当我在 iOS 模拟器上运行它时,应该为每个按钮设置图像的行似乎不起作用。当我初始化每个按钮时,我用UIButtonType.infoLight 类型初始化它们,因为我想使用与普通infoLight 按钮相同的样式(例如文本颜色)。我想更改的infoLight 类型的唯一属性是它旁边的图像(默认情况下是(i))。我想将图标变成UIImage(contentsOfFile: "up.png"),但它似乎不起作用。 请任何人提出我可以做出的任何改变来实现这一目标?

我目前正在尝试对现有的内容进行一些更改,例如将类型更改为.custom,看看是否会更改图像,但这也不起作用。它只会重置我想使用的.infoLight 的格式,所以我把它切换回来了。但是,如果您的解决方案需要我将其改回 .custom,那么我可以做到。

我也尝试更改我的代码以仅将 up.png 替换为 up,但它仍然不起作用。

我的代码都没有引发任何警告或错误。

编辑:大多数答案都建议我将我的UIImage(contentsOfFile: "") 更改为UIImage(named: ""),我已经这样做了,但它占用了 UIButton 的整个框架,我想更改它,并保持与.infoLight 相同,方法是在右侧保留一个带有标签的小图像。任何人都可以提出解决方法吗?

关于这个问题的独特之处是什么?:虽然 .setImage() 已通过使用 UIImage(named:) 而不是 UIImage(contentsOfFile:) 来解决,但我也想喜欢在按钮对象中保留.setTitle() 标签。 UIImage(named:) 调用使图像填充按钮的整个 框架,但我想保持它与.infoLight 相同,带有右侧标题的小图像。

【问题讨论】:

  • 错误一:UIImage(contentsOfFile: "up.png" 错误二:如果要给按钮设置图片,为什么还要设置标题?错误三: UIButton(type: UIButtonType.infoLight)
  • 感谢您的评论。我设置了标题和图像,因为我想让我的按钮很像默认的.infoLight 类,它既有标题又有图像,这是我想要的。本质上,我试图获得一个 .infoLight 按钮,其中 (i) 更改为自定义图像。
  • 添加编辑以指出与其他问题@ItsMeMihir 的可能差异

标签: ios swift swift3 uibutton uiimage


【解决方案1】:

使用背景图片,像这样:

refreshItemsButton.setBackgroundImage(
   UIImage(named:"up.png"),
   for:UIControlState.normal)

【讨论】:

  • 也感谢您的回答!由于这与 Harshal 的答案基本相同,因此我似乎遇到了与 Harshal 的答案相同的问题。请问你能建议一个解决方法吗?具体来说,您能否建议我如何将图像仅放在按钮中标题的左侧?
  • 对不起,我错过了您实际上希望文本显示在右侧而不是居中的点。澄清一下,我的回答与 Harshal 的略有不同,我建议设置 backgroundImage 属性而不是 image
  • 谢谢!好吧,我已经按照您的建议尝试了setBackgroundImage,但它似乎仍然不起作用,它只是填满了框架。有关如何解决此问题的任何建议?
【解决方案2】:

使用此代码 -

func setupRefreshItemsButton() -> UIButton {
            let refreshItemsButton = UIButton(type: UIButtonType.custom)
            refreshItemsButton.frame = CGRect(x:0, y:screenHeight*55/100, width: screenWidth*30/100, height: screenHeight*5/100)
            refreshItemsButton.setTitle("  Refresh lesson items", for: UIControlState.normal)
            refreshItemsButton.setImage(UIImage(named: "up.png"), for: UIControlState.normal)
            self.addSubview(refreshItemsButton)
            return refreshItemsButton
        }

【讨论】:

  • 也感谢您的回答!由于这与 Harshal 的答案基本相同,因此我似乎遇到了与 Harshal 的答案相同的问题。请问你能建议一个解决方法吗?
【解决方案3】:

如果你想要按钮标题左侧的图像试试这个-:

refreshItemsButton.setImage(UIImage(named: "up.png"), for: .normal)
refreshItemsButton.imageEdgeInsets = UIEdgeInsetsMake(0,-10, 0, 0)
refreshItemsButton.imageView?.layer.masksToBounds = true
refreshItemsButton.contentMode = .scaleAspectFit

希望对你有帮助。

【讨论】:

  • 感谢您的回答!当我说我需要按钮标题左侧的图像并且您正在努力实现它时,我想您理解我的意思,但是这段代码仍然不起作用。您是否可以编辑您的答案以包含此函数的整个代码,以防我放错了应该放入此代码的位置?
  • @sccoding 你的图片尺寸是多少?
  • 我的图像是一个 50x50 的正方形图像,但我希望它与 .infoLight 设置中 (i) 的默认图像大小相同。我想保留标题,拜托。有什么建议吗?
  • 你能做一件事来测试吗?您可以下载任何小图标图像并应用到我提到的按钮上,只是为了检查方法是否正常,或者使用您拥有的任何 25×25 左右的图标图像
  • 我已经按照你所说的做了一张示例图片。我仍然遇到同样的问题。图像将填满按钮的整个框架,并且标题仍然不会显示。对我能做什么有什么建议吗?
【解决方案4】:

使用这段代码,其实是:

button.setBackgroundImage(UIImage.init(named: "image"), for: .normal)
button.titleLabel?.textAlignment = .left

【讨论】:

  • 也感谢您的回答!由于这与 Harshal 的答案基本相同,因此我似乎遇到了与 Harshal 的答案相同的问题。请问你能建议一个解决方法吗?具体来说,您能否建议我如何将图像仅放在按钮中标题的左侧?
  • 我正在更新答案@sccoding
  • 您好,感谢您的新回答!我还没有对此进行测试,但我想要求澄清一下,你为什么使用UIImage.init(named: "") 而不仅仅是UIImage(named: "")
  • 您好,我已经对此进行了测试,但它似乎仍然不起作用,结果与其他答案相同。但是,您能否编辑您的答案以将所有代码包含在函数 setupRefreshItemsButton 中,这样我就可以确保我没有放错您的代码应该放在哪里?
  • 不要区分它们都是真的@sccoding
【解决方案5】:

经过一些研究,我发现了更多关于UIButton 的信息。它继承自UIView,这意味着您可以像在UIView 上一样在UIButton 上使用.addSubview()

例如,可以这样做:

let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
let myButtonBackgroundImage = UIImage(named: "icon.png")
let myButtonBackgroundImageView = UIImageView(frame: x: 0, y: 0, width: 20, height: 20)
myButtonBackgroundImageView.image = myButtonBackgroundImage
myButton.addSubview(myButtonBackgroundImageView)
let myButtonTitleLabel = UILabel(x: 5, y:5, width: 10, height: 10)
myButtonTitleLabel.text = "Hi"
myButton.addSubview(myButtonTitleLabel)

所以本质上,虽然没有直接的方法可以做到这一点,但将UIButton 视为UIView 可以形成像上面这样的解决方法,它显示背景图像和前面的标题,正是我正在寻找。

【讨论】:

    【解决方案6】:

    你可以试试这个:

    element.setImage 
    

    element.reloadInputViews()
    

    这对我有用...

    【讨论】:

    • 根据文档,它与图像无关:“当对象是第一响应者时更新自定义输入和附件视图。”我猜它对你有用,因为你是一个自定义按钮
    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多