チェックマークのようなUIButtonサブクラスを作成しました。ここでカスタムUIButton @IBDesignable
クラスです:
import UIKit
@IBDesignable
class CheckedButton: UIButton {
// MARK: - Properties
@IBInspectable var checked: Bool = false {
didSet {
// Toggle the check/uncheck images
updateImage()
}
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
private func setup() {
updateImage()
self.addTarget(self, action: #selector(tapped), for: .touchUpInside)
}
private func updateImage() {
let image = checked ? UIImage(named: "checked") : UIImage(named: "unchecked")
self.setImage(image, for: .normal)
}
/// Called each time the button is tapped, and toggles the checked property
@objc private func tapped() {
checked = !checked
print("New value: \(checked)")
}
}
私は@IBInspectableとしてchecked
プロパティを設定しているので、私はIBでそれを参照してください。
奇妙なことがある:
- 場合私はこのプロパティを
default
としました。ストーリーボードに正しく表示されています。
- が、私はインスペクタinthe
on
またはoff
のいずれかを選択した場合、画面が正しく更新されません。
クラスが@IBDesignableマークされているように、私は、ボタンの外観はインスペクタ]タブでは、このプロパティに設定された値に応じてIBに更新するよう期待します。 手掛かりがありますか?
private func updateImage() {
let image = checked ? UIImage.image(name: "checked", self) : UIImage(name: "unchecked", self)
setImage(image, for: .normal)
}
また、UIButtonクラスがチェックしている状態、あなたが作成することなく使用することができます。
extension UIImage {
public static func image(name: String, _ sender: UIView?) -> UIImage? {
#if TARGET_INTERFACE_BUILDER
if let sender = sender {
let bundle = Bundle(for: sender.classForCoder)
return UIImage(named: name, in: bundle, compatibleWith: sender.traitCollection)
} else {
return UIImage(named: name)
}
#else
return UIImage(named: name)
#endif
}
}
ご例えば:
感謝。しかし、あなたのエクステンションは、資産ライブラリにあるいくつかの画像を取得するのがかなり複雑になります(これは、今日のAppleが推奨する方法です)。また、私はこのボタンを複数回使用するので、このボタンをサブクラス化する必要があります。同じ画像設定を何度も繰り返したくはありません。 –