swift UIView 子类,带有来自传递值的可选 SubViews
swift UIView subclass with optional SubViews from passed value
我有一个 UIView 子类,它有一个 UILabel 标题,一个按钮和另一个子视图,当在另一个 viewcontroller.
中使用该视图时,该子视图将根据传递的值进行更改
class CustomView: UIView {
enum PickerType {
case pikerView
case datePicker
}
private var dialogView: UIView!
private var titleLabel: UILabel!
private var pickerView: UIPickerView!
private var datePicker: UIDatePicker!
private var pickerType: PickerType!
init() {
super.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height))
setupView()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupView() {
self.dialogView = createContainerView()
self.dialogView.layer.shouldRasterize = true
self.dialogView.layer.rasterizationScale = UIScreen.mainScreen().scale
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.mainScreen().scale
self.dialogView.layer.opacity = 0.5
self.dialogView.layer.transform = CATransform3DMakeScale(1.3, 1.3, 1)
self.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0)
self.addSubview(self.dialogView)
}
private func createContainerView() -> UIView {
let screenSize = getScreenSize()
let dialogSize = CGSizeMake(screenSize.width, 300)
// For the black background
self.frame = CGRectMake(0, 0, screenSize.width, screenSize.height)
let dialogContainer = UIView(frame: CGRectMake(0, screenSize.height - dialogSize.height, dialogSize.width, dialogSize.height))
//Title
self.titleLabel = UILabel(frame: CGRectMake(10, 10, dialogSize.width - 20, 30))
self.titleLabel.textAlignment = NSTextAlignment.Center
self.titleLabel.font = UIFont.boldSystemFontOfSize(17)
dialogContainer.addSubview(self.titleLabel)
//Add the PickerView
addPickerView(dialogContainer)
return dialogContainer
}
/**Add the appropriate view based on pickerType*/
private func addPickerView(dialogContainer: UIView) {
let screenSize = countScreenSize()
let dialogSize = CGSizeMake(screenSize.width, 250)
if pickerType == PickerType.pikerView {
self.pickerView = UIPickerView(frame: CGRectMake(10, 30, 0, 0))
self.pickerView.autoresizingMask = UIViewAutoresizing.FlexibleRightMargin
self.pickerView.frame.size.width = dialogSize.width - 20
dialogContainer.addSubview(self.pickerView)
} else if pickerType == PickerType.datePicker {
self.datePicker = UIDatePicker(frame: CGRectMake(10, 30, 0, 0))
self.datePicker.autoresizingMask = UIViewAutoresizing.FlexibleRightMargin
self.datePicker.frame.size.width = dialogSize.width - 20
dialogContainer.addSubview(self.datePicker)
}
}
func showPickerView(title: String) {
self.pickerType = PickerType.pikerView
self.titleLabel.text = title
}
func showDatePicker(title: String) {
self.pickerType = PickerType.datePicker
self.titleLabel.text = title
}
}
想法是,如果 CustomView().showPickerView 被调用,那么 pickerType 变量将被分配适当的值并加载 UIPickerView。如果调用 CustomView().showDatePicker,则加载 UIDatePicker。
我的问题是,在调用 showPickerView() 或 showDatePicker() 之前调用了 addPickerView。
如何在初始化视图之前传递 pickerType 的值?
我通过将初始值设定项更改为:
init(picker: PickerType) {
super.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height))
self.pickerType = picker
setupView()
}
并在 CustomView 之外取出 PickerType 枚举。
现在我可以使用自定义视图了:
CustomView(picker: PickerType.datePicker).showDatePicker("Select date")
CustomView(picker: PickerType.pickerView).showPickerView("Select data")
但如果有更有效的实现方法,我会喜欢建议。
我有一个 UIView 子类,它有一个 UILabel 标题,一个按钮和另一个子视图,当在另一个 viewcontroller.
中使用该视图时,该子视图将根据传递的值进行更改class CustomView: UIView {
enum PickerType {
case pikerView
case datePicker
}
private var dialogView: UIView!
private var titleLabel: UILabel!
private var pickerView: UIPickerView!
private var datePicker: UIDatePicker!
private var pickerType: PickerType!
init() {
super.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height))
setupView()
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupView() {
self.dialogView = createContainerView()
self.dialogView.layer.shouldRasterize = true
self.dialogView.layer.rasterizationScale = UIScreen.mainScreen().scale
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.mainScreen().scale
self.dialogView.layer.opacity = 0.5
self.dialogView.layer.transform = CATransform3DMakeScale(1.3, 1.3, 1)
self.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0)
self.addSubview(self.dialogView)
}
private func createContainerView() -> UIView {
let screenSize = getScreenSize()
let dialogSize = CGSizeMake(screenSize.width, 300)
// For the black background
self.frame = CGRectMake(0, 0, screenSize.width, screenSize.height)
let dialogContainer = UIView(frame: CGRectMake(0, screenSize.height - dialogSize.height, dialogSize.width, dialogSize.height))
//Title
self.titleLabel = UILabel(frame: CGRectMake(10, 10, dialogSize.width - 20, 30))
self.titleLabel.textAlignment = NSTextAlignment.Center
self.titleLabel.font = UIFont.boldSystemFontOfSize(17)
dialogContainer.addSubview(self.titleLabel)
//Add the PickerView
addPickerView(dialogContainer)
return dialogContainer
}
/**Add the appropriate view based on pickerType*/
private func addPickerView(dialogContainer: UIView) {
let screenSize = countScreenSize()
let dialogSize = CGSizeMake(screenSize.width, 250)
if pickerType == PickerType.pikerView {
self.pickerView = UIPickerView(frame: CGRectMake(10, 30, 0, 0))
self.pickerView.autoresizingMask = UIViewAutoresizing.FlexibleRightMargin
self.pickerView.frame.size.width = dialogSize.width - 20
dialogContainer.addSubview(self.pickerView)
} else if pickerType == PickerType.datePicker {
self.datePicker = UIDatePicker(frame: CGRectMake(10, 30, 0, 0))
self.datePicker.autoresizingMask = UIViewAutoresizing.FlexibleRightMargin
self.datePicker.frame.size.width = dialogSize.width - 20
dialogContainer.addSubview(self.datePicker)
}
}
func showPickerView(title: String) {
self.pickerType = PickerType.pikerView
self.titleLabel.text = title
}
func showDatePicker(title: String) {
self.pickerType = PickerType.datePicker
self.titleLabel.text = title
}
}
想法是,如果 CustomView().showPickerView 被调用,那么 pickerType 变量将被分配适当的值并加载 UIPickerView。如果调用 CustomView().showDatePicker,则加载 UIDatePicker。
我的问题是,在调用 showPickerView() 或 showDatePicker() 之前调用了 addPickerView。
如何在初始化视图之前传递 pickerType 的值?
我通过将初始值设定项更改为:
init(picker: PickerType) {
super.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, UIScreen.mainScreen().bounds.size.height))
self.pickerType = picker
setupView()
}
并在 CustomView 之外取出 PickerType 枚举。
现在我可以使用自定义视图了:
CustomView(picker: PickerType.datePicker).showDatePicker("Select date")
CustomView(picker: PickerType.pickerView).showPickerView("Select data")
但如果有更有效的实现方法,我会喜欢建议。