【问题标题】:How to properly create a button with an image inside of it如何正确创建一个内部带有图像的按钮
【发布时间】:2017-01-12 00:38:25
【问题描述】:

请允许我先说我在堆栈溢出时研究了与此类似的不同问题(而且我是 iOS/Swift 的新手),他们确实提供了帮助。不过,我现在的问题如下,其实是2。

第一个问题是是否可以在 viewDidLoad 方法中嵌套函数?当我将它作为 func createButton 进行尝试时,它甚至没有显示两个不同的新按钮,实际上除了我通过情节提要添加的单一图像之外,它什么也没有显示。

第二个问题是引用图像的正确方法是什么,因为当我尝试运行我的代码时,我看到创建了两个仅具有蓝色背景的按钮。对此的扩展是“操作:”按钮创建部分的正确语法是什么,因为我不知道引用您自己的函数的有效方法是什么。

代码如下:

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var imageNames : [String] = ["dino2Button", "dino3Button"]
        var yposition : Int = 133
        let xposition : Int = 112
        let width : Int = 150
        let height : Int = 113

        //func createButton() {
            for index in 0...1 {
                print("index is: \(index)")
                let image = UIImage(named: imageNames[index]) as UIImage?
                let button = UIButton(type: .roundedRect) as UIButton
                button.frame = CGRect(x: xposition, y: (yposition+10), width: width, height: height)
                yposition += height + 10;
                button.setImage(image, for: .normal)
                button.addTarget(self, action: "", for: .touchUpInside)
                self.view.addSubview(button)

            }
        //}


    }

再一次,我总共做了两天的 iOS。

【问题讨论】:

  • 这里有几个问题。首先,也许是最重要的 - 如果您刚刚学习 iOS 和 Swift 两天(而且您做得很好),请考虑现在花时间学习自动布局而不是框架。不同的设备有不同的框架尺寸,自动布局非常值得。其次,您看到空白/蓝色图像的原因是您的 UIImage 为零。检查拼写,包括大小写。此外,唯一没有文件扩展名的 UIImage(named:) 是 PNG(也区分大小写)。如果是.jpg,则需要添加“.jpg”。
  • 第三,addTarget 中的动作是 Selector 类型 - 所以语法上 make 是 #selector(myFunc) 并添加一个简单的 func 来执行类似 print("got here ") 以确保连接正确。祝你好运!
  • @dfd 感谢您的帮助。显然我的问题是它应该是 button.setBackgroundImage 而不是 .setImage;尽管它们的类型可能是 .jpg 而不是 .png (我想我还没有检查过)。我一定会研究自动布局。另外,一个快速的附带问题,在为 iOS 开发时,故事板更常用于布局,还是故事板和代码的平衡组合?干杯!
  • 我的观点——而且唯一的——是它取决于编码器。 Apple 在设计时工具(如用于自动布局的 InterfaceBuilder)方面做得非常好,但是,就像几乎任何事情一样,理解它(有时知道如何在需要时深入代码)会大有帮助。无论哪种方式,如果您特别在 iOS 上使用框架(许多遗留编码器仍然使用),您很快就会遇到需要回答 Apple 引入新设备尺寸时会发生什么 - 就在今天,我听到了关于10.5 英寸 iPad。您希望您的 iOS 布局能够在所有尺寸上无缝工作。

标签: ios swift


【解决方案1】:

是的,只要它们不执行异步操作,就可以在视图中嵌套函数加载。如果他们是你必须意识到你不能保证他们会在你的视图出现之前完成。但除此之外,嵌套函数并没有真正的问题。

编辑:检查苹果documents

要将图像添加到您的按钮,如下所示:

button.setImage(UIImage(named: "checkbox_off"), for: .normal)
button.setImage(UIImage(named: "checkbox_on"), for: .selected)
button.setImage(UIImage(named: "checkbox_on"), for: .highlighted)

向按钮添加动作:

button.addTarget(self, action: #selector(CheckBox.touchUpInside(_sender:)), for: .touchUpInside)

CheckBox 是您的类名(按钮所在的名称或您想调用的任何其他名称且目标指向的名称(在本例中为“self”))

func touchUpInside(_sender: Any?) {

    self.isSelected = !(self.isSelected)

}

【讨论】:

  • 现在,我能够通过执行以下操作找出按钮操作:#selector(clicky(sender:))。作为一个来自一切都是类的 Java 世界的人,在这种情况下,我的 CheckBox 类名是什么?另外,我尝试设置按钮背景图像的方式是否不正确,因为它只是显示为蓝屏。
  • 好吧,我该死的,那是 button.setBackgroundImage。我看到的所有其他答案都设置为 button.setImage
  • 两者都有,但他们做的事情不同。背景图像将让您在前面有一个文本,并将图像作为背景。设置的图像使图像成为实际的按钮。
  • 我明白了,因为每次我将它设置回 .setImage 时,它​​仍然只显示为蓝屏。是否有可能我可能还需要使用诸如按比例缩放之类的东西?
  • 确保您的图像被正确检索。 (在将其设置为按钮之前检查 nil)
猜你喜欢
  • 2016-11-10
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2016-06-19
  • 2012-04-15
  • 2019-11-11
  • 1970-01-01
  • 2011-08-24
相关资源
最近更新 更多