Swift 带有初始参数的自定义 UIView
Swift Custom UIView with init parameters
我写了一个自定义的 UIView class,它接受几个参数并覆盖一个空的故事板 UIView(subclassed 作为 MultiPositionTarget class 而不是 UIview)作为 below.The 下面的视图链接为视图控制器的出口,如下面的代码所示(总共 9 个视图)。
// Initialize the targets
target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")
target1.parentVC = self
targetList.append(target1)
但是,它不接受参数。并且只加载视图。下面是我的 class:
class MultiPositionTarget: UIView{
var targetName: String!
var bottomLabelName: String!
var imageName: String!
var isSelected: Bool!
var labelTop: UILabel!
var labelBottom: UILabel!
var parentVC: SelectTargetViewController!
init(_ frame: CGRect,_ imagName: String,_ targetname: String,_ targetlabel: String){
self.imageName = imagName
self.targetName = targetname
self.bottomLabelName = targetlabel
super.init(frame: frame)
setUp()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUp()
}
func setUp(){
let viewWidth = self.bounds.width
let viewHeight = self.bounds.height
// Add top label
labelTop = UILabel(frame: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight/5))
//labelTop.center = CGPoint(x: 160, y: 285)
labelTop.textAlignment = .center
labelTop.font = UIFont(name:"System",size:6)
labelTop.text = self.imageName
labelTop.textColor = UIColor.white
labelTop.backgroundColor = hexStringToUIColor(hex: "#770B2C")
//labelTop.alpha = 0.5
self.addSubview(labelTop)
let image = UIImage(named: "targetTemp.png")
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 0, y: (viewHeight-viewHeight * 4/5), width: viewWidth, height: (viewHeight * 4/5))
self.addSubview(imageView)
// Add bottom Label
labelBottom = UILabel(frame: CGRect(x: 0, y: (viewHeight * 4/5), width: viewWidth, height: viewHeight/5))
//labelBottom.center = CGPoint(x: 160, y: 285)
labelBottom.textAlignment = .center
labelBottom.text = self.bottomLabelName
labelBottom.font = UIFont(name:"System",size:10)
labelBottom.textColor = UIColor.white
labelBottom.backgroundColor = hexStringToUIColor(hex: "770B2C")
labelBottom.alpha = 0.95
self.addSubview(labelBottom)
self.isUserInteractionEnabled = true
let viewTap = UITapGestureRecognizer(target: self, action: #selector(singleTap))
self.addGestureRecognizer(viewTap)
}
}
感谢任何帮助或提示。在此先感谢堆栈溢出系列。
此行正在创建 新 视图:
target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")
新视图与屏幕上显示的视图无关。新视图实际上根本不在屏幕上,因为您还没有将它添加到视图层次结构中。即使你这样做了,它也是不可见的,因为它的帧数为零。
简而言之,您不能调用您的自定义初始化器并且在故事板中设计您的视图。您也可以在故事板或代码中初始化所需的属性。
如果你也想初始化故事板中的属性,你可以将imageName
、bottomLabelName
和targetName
修改为@IBInsepctable
:
@IBInsepctable var targetName: String!
@IBInsepctable var bottomLabelName: String!
@IBInsepctable var imageName: String!
// or, if you want to directly select an image from the storyboard:
// @IBInsepctable var image: UIImage!
这样,这些属性将显示在故事板的 属性 检查器中。
如果你想在代码中初始化它,你必须用赋值语句设置它,而不是用初始化器:
target1.targetName = "David"
target1.bottomLabelName = "Target"
target1.imageName = "targetTemp.png"
target1.parentVC = self
targetList.append(target1)
我写了一个自定义的 UIView class,它接受几个参数并覆盖一个空的故事板 UIView(subclassed 作为 MultiPositionTarget class 而不是 UIview)作为 below.The 下面的视图链接为视图控制器的出口,如下面的代码所示(总共 9 个视图)。
// Initialize the targets
target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")
target1.parentVC = self
targetList.append(target1)
但是,它不接受参数。并且只加载视图。下面是我的 class:
class MultiPositionTarget: UIView{
var targetName: String!
var bottomLabelName: String!
var imageName: String!
var isSelected: Bool!
var labelTop: UILabel!
var labelBottom: UILabel!
var parentVC: SelectTargetViewController!
init(_ frame: CGRect,_ imagName: String,_ targetname: String,_ targetlabel: String){
self.imageName = imagName
self.targetName = targetname
self.bottomLabelName = targetlabel
super.init(frame: frame)
setUp()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUp()
}
func setUp(){
let viewWidth = self.bounds.width
let viewHeight = self.bounds.height
// Add top label
labelTop = UILabel(frame: CGRect(x: 0, y: 0, width: viewWidth, height: viewHeight/5))
//labelTop.center = CGPoint(x: 160, y: 285)
labelTop.textAlignment = .center
labelTop.font = UIFont(name:"System",size:6)
labelTop.text = self.imageName
labelTop.textColor = UIColor.white
labelTop.backgroundColor = hexStringToUIColor(hex: "#770B2C")
//labelTop.alpha = 0.5
self.addSubview(labelTop)
let image = UIImage(named: "targetTemp.png")
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 0, y: (viewHeight-viewHeight * 4/5), width: viewWidth, height: (viewHeight * 4/5))
self.addSubview(imageView)
// Add bottom Label
labelBottom = UILabel(frame: CGRect(x: 0, y: (viewHeight * 4/5), width: viewWidth, height: viewHeight/5))
//labelBottom.center = CGPoint(x: 160, y: 285)
labelBottom.textAlignment = .center
labelBottom.text = self.bottomLabelName
labelBottom.font = UIFont(name:"System",size:10)
labelBottom.textColor = UIColor.white
labelBottom.backgroundColor = hexStringToUIColor(hex: "770B2C")
labelBottom.alpha = 0.95
self.addSubview(labelBottom)
self.isUserInteractionEnabled = true
let viewTap = UITapGestureRecognizer(target: self, action: #selector(singleTap))
self.addGestureRecognizer(viewTap)
}
}
感谢任何帮助或提示。在此先感谢堆栈溢出系列。
此行正在创建 新 视图:
target1 = MultiPositionTarget(.zero,"targetTemp.png","David","Target")
新视图与屏幕上显示的视图无关。新视图实际上根本不在屏幕上,因为您还没有将它添加到视图层次结构中。即使你这样做了,它也是不可见的,因为它的帧数为零。
简而言之,您不能调用您的自定义初始化器并且在故事板中设计您的视图。您也可以在故事板或代码中初始化所需的属性。
如果你也想初始化故事板中的属性,你可以将imageName
、bottomLabelName
和targetName
修改为@IBInsepctable
:
@IBInsepctable var targetName: String!
@IBInsepctable var bottomLabelName: String!
@IBInsepctable var imageName: String!
// or, if you want to directly select an image from the storyboard:
// @IBInsepctable var image: UIImage!
这样,这些属性将显示在故事板的 属性 检查器中。
如果你想在代码中初始化它,你必须用赋值语句设置它,而不是用初始化器:
target1.targetName = "David"
target1.bottomLabelName = "Target"
target1.imageName = "targetTemp.png"
target1.parentVC = self
targetList.append(target1)