UIButton .setImage()在Swift 3

时间:2017-08-05 06:23:57

标签: ios swift swift3 uibutton uiimage

我正在尝试向UIView子类添加多个按钮。在init()子类的UIView方法(称为leftPanel)中,我添加了多个不同函数的调用来添加每个按钮。这就是我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保持一致,并使用小图片右边的标题。

6 个答案:

答案 0 :(得分:3)

使用背景图片,如下所示:

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

答案 1 :(得分:0)

使用此代码 -

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
        }

答案 2 :(得分:0)

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

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

希望它有所帮助。

答案 3 :(得分:0)

使用此代码,实际上是:

foo:54:1: Error: bar is not a baz

答案 4 :(得分:0)

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

例如,可以这样做:

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可以形成如上所述的解决方法,其中显示背景图像和前面的标题,正是我在寻找的。

答案 5 :(得分:0)

你可以试试这个:

element.setImage 

element.reloadInputViews()

这对我有用......