我正在开发一款游戏,并希望创建一个简单的应用程序皮肤配置。
我遇到了设备特定的常量。例如,我想存储特定于设备的字体大小。让我们说我需要iPhone为30,iPad需要45。现在我通过声明全局变量来做到这一点:
// ViewController.swift
Import UIKit
// ...
class ViewController: UIViewController, CustomUserControlDelegate {
// Properties
// ...
@IBOutlet weak var customUserControl: CustomUserControl!
// Instance of CustomUserControl in this UIViewController
override func viewDidLoad() {
super.viewDidLoad()
// ...
// Custom user control, handle through delegate callbacks.
customUserControl.delegate = self
}
// ...
// CustomUserControlDelegate
func didChangeValue(value: Int) {
// do some stuff with 'value' ...
}
}
然后像这样使用它:
let h2FontSize : CGFloat = UIDevice.currentDevice().userInterfaceIdiom == .Pad ? 45 : 30
但这似乎不是一个漂亮的解决方案,因为我也有h1,h3 fontSize,它们看起来都一样。
private let topLabel = CCLabelTTF(string: "", fontName: mainFontName, fontSize: h2FontSize)
如何处理特定于设备的常量?
答案 0 :(得分:1)
如何处理特定于设备的常量?
将它们作为数据模型的一部分。这些值不是真正的常量 - 它们在设置后可能不会更改,但它们在执行期间配置,并且它们取决于运行应用程序的环境的详细信息。因此,请将它们视为应用中的任何其他数据,并将它们放入数据模型中。
答案 1 :(得分:0)
您可以执行以下操作:
private extension UIDevice {
static func isIpad() -> Bool {
return currentDevice().userInterfaceIdiom == .Pad
}
}
struct Font {
struct Size {
static let H1: CGFloat = UIDevice.isIpad() ? 60 : 45
static let H2: CGFloat = UIDevice.isIpad() ? 45 : 30
static let H3: CGFloat = UIDevice.isIpad() ? 30 : 15
}
}
然后,可以直接在Font结构中创建所有Font样式。因此,如果您需要更多样式,您可以使H1返回带有您需求的样式UIFont,而不仅仅是CGFloat,它会使您的样式更加分离。
然后,您可以通过创建一个Style结构来改进这一点,该结构将UIDevice作为依赖项而不是使用currentDevice()单例。