Swift: 设置UIView为UIBarButton/UIButton的背景
Swift: Set UIView as the background of UIBarButton/UIButton
如何将 UIView
设置为 UIBarButton
的背景? UIBarButton/UIButton
应包含其标题和背景图片。
我尝试覆盖 UIButton
class,但它不起作用。如果有人有解决方案请告诉我。
您可以将视图添加为按钮的 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)
}
}
// 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())
您可以使用继承自 UIControl 的 CustomButton。通过使用 xib,您可以根据您的要求管理您的 UI。您可以在其中添加 n 个 UI 元素。您将获得默认的事件处理程序,例如 UIButton(例如 touchupinside、touchupoutside、valuechange)。您可以为此提供 IBActions。附上一些屏幕截图供参考。如果您在实施时遇到任何问题,请告诉我。继续编码。
也许你应该使用 UIImageView.image 而不是 UIView 本身来设置底部背景图像。
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)
}
}
如何将 UIView
设置为 UIBarButton
的背景? UIBarButton/UIButton
应包含其标题和背景图片。
我尝试覆盖 UIButton
class,但它不起作用。如果有人有解决方案请告诉我。
您可以将视图添加为按钮的 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)
}
}
// 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())
您可以使用继承自 UIControl 的 CustomButton。通过使用 xib,您可以根据您的要求管理您的 UI。您可以在其中添加 n 个 UI 元素。您将获得默认的事件处理程序,例如 UIButton(例如 touchupinside、touchupoutside、valuechange)。您可以为此提供 IBActions。附上一些屏幕截图供参考。如果您在实施时遇到任何问题,请告诉我。继续编码。
也许你应该使用 UIImageView.image 而不是 UIView 本身来设置底部背景图像。
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)
}
}