Swift:将UIView设置为UIBarButton / UIButton的背景

时间:2019-03-19 06:46:37

标签: ios swift uibutton uibarbuttonitem

如何将UIView设置为UIBarButton的背景? UIBarButton/UIButton应包含其标题和背景图片。

我尝试了覆盖UIButton类,但是它不起作用。如果有人有解决方案,请告诉我。

4 个答案:

答案 0 :(得分:0)

您可以将视图添加为按钮的subView

extension UIButton {
    func setBackgroundView(view: UIView) {
        view.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
        view.isUserInteractionEnabled = false
        self.addSubview(view)
    }
}

答案 1 :(得分:0)

// For UIBarButtonItem (just set customView parameter)

let frame = CGRect(x: 0, y: 0, width: 100, height: 40)
let customView = UIView(frame: frame)
customView.backgroundColor = .red

let barButtonItem = UIBarButtonItem(customView: customView)

// for UIButton

// 1. Subview case (add subview on your target UIButton, send to back so that it does not cover title)

let button0 = UIButton(frame: frame)
button0.addSubview(customView)
button0.sendSubviewToBack(customView)
button0.setTitle("Button", for: UIControl.State())

// 2. Rendered image case (as an alternative render your view to an image and add as a background image)

// Extension for capturing a UIVIew as an image:
extension UIImage {
    convenience init?(view: UIView) {
        UIGraphicsBeginImageContext(view.frame.size)
        guard let ctx = UIGraphicsGetCurrentContext() else {
            return nil
        }
        view.layer.render(in: ctx)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        guard let cgImage = image?.cgImage else {
            return nil
        }
        self.init(cgImage: cgImage)
    }
}

let button1 = UIButton(frame: frame)
let customViewImage = UIImage.init(view: customView)
button1.setBackgroundImage(customViewImage, for: UIControl.State())
button1.setTitle("Button", for: UIControl.State())

答案 2 :(得分:0)

您可以使用从UIControl继承的CustomButton。通过使用xib,您可以根据需要管理UI。您可以在其中添加n个UI元素。您将获得带有UIButton之类的默认事件处理程序(如touchupinside,touchupoutside,valuechange)。您可以提供相同的IBAction。作为参考,请附上一些屏幕截图。让我知道您在执行此操作时是否遇到任何困难。继续编码。

Add XIB

Add subclass of UIControl and manage IBOut

Manage events

答案 3 :(得分:0)

Maybe you should use UIImageView.image instead of the UIView itself to set the bottom background image.

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myButton: UIButton!
    @IBOutlet weak var myView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        myButton.setBackgroundImage(myView.image, for: .normal)
    }
}