UIView与视图
1.标签和按钮
class ViewController:UIViewController{
var label:UILabel! //这个属性是strong的
override func viewDidLoad(){
super.viewDidLoad()
let screen = UIScreen.main.bounds
let labelWidth:CGFloat = 90
let labelHeight:CGFloat = 20
let labelTopView:CGFloat = 150
let labelFrame = CGRect(x:(screen.size.width - labelWidth)/2,
y:labelTopView,
width:labelWidth,
height:labelHeight)
self.label = UILabel(frame:labelFrame)
self.label.text = "HelloWorld"
self.label.textAlignment = .center
self.view.addSubView(self.label)
let button = UIButton(type:.system)//通过type属性创建button对象
button.setTitle("OK",.normal)//设置UIButton某种状态下的title
let buttonWidth:CGFloat = 60
let buttonHeight:CGFloat = 20
let buttonTopView:CGFloat = 240
button.frame = CGRect(x:(screen.size.width - buttonWidth)/2,
y:buttonTopView,
width:buttonWidth,
height:buttonHeight)
button.addTarget(self,action:#selector(onClick(_:)),for:.touchUpInside)//事件处理
self.view.addSubView(button)
}
}
❗在纯代码构建页面时,如果label的属性是weak的,那么执行创建label属性对象,但label对象的内存马上就会被释放。strong属性可以保持刚刚创建的对象内存不释放,视图控制器拥有label属性对象的所有权。
❗而在IB实现中label属性是weak,这是因为在IB实现时label视图是在故事板或者XIB文件中定义的,当应用程序启动时会根据故事板或者XIB文件的描述创建label等视图对象,对象所有权在故事板或者XIB,它们对label等视图对象是强引用的。由于对象所有权不是视图控制器,所以在视图控制器中使用它不能定义为strong,只能定义为weak
2.TextField和TextView
class ViewController:UIViewController,UITextFieldDelegate,UITextViewDelegate{
/*如果ViewController只是实现委托协议,并不意味着ViewController真正成为TextField和TextView的委托对象,我们还需要将ViewController当前对象赋值给TextView和TextField控件的delegate的委托属性,否则委托方法不会被调用。*/
override func viewDidLoad(){
super.viewDidLoad()
let screen = UIScreen.main.bounds
let textFieldWidth:CGFloat = 223
let textFieldHeight:CGFloat = 30
let textFieldTopView:CGFloat = 150
let textFieldFrame = CGREct(x:(screen.size.width - textFieldWidth)/2,
y:textFieldTopView,
width:textFieldWidth,
height:textFieldHeight)
let textField = UITextField(frame:textFieldFrame)
textField.borderStyle = .roundedRect
textField.delegate = self //将当前控制器self赋值给TextField控件的delegate委托属性
self.view.addSubView(textField)
let labelNameTextFieldSpace:CGFloat = 30
let labelNameFrame = CGRect(x:textField.frame.origin.x,
y:textField.frame.origin.y - labelNameTextFieldSpace,
width:51,
height:21)
let labelName = UILabel(frame:labelNameFrame)
labelName.text = "Name:"
self.view.addSubView(labelName)
let textViewWidth:CGFloat = 236
let textViewHeight:CGFloat = 198
let textViewTopView:CGFloat = 240
let textView = UITextView(frame:
CGRect(x:(screen.size.width - textViewwidth)/2,
y:textViewTopView,
width:textViewWidth,
height:textViewHeight)
)
textView.text = "please input……"
textView.delegate = self
self.view.addSubView(textView)
let labelAbstractTextViewSpace:CGFloat = 30
let labelAbstract = UILabel(frame:
CGRect(x:textView.frame.origin.x,
y:textView.frame.origin.y - labelAbstractTextViewSpace
width:103
height:21)
)
labelAbstract.text = "Abstract:"
self.view.addSubView(labelAbstract)
}
//实现UITextFieldDelegate委托协议方法
func textFieldShouldReturn(textField:UITextField)->Bool {
textField.resignFirstResponder()//键盘打开
print("got it!")
return true
}
//实现UITextViewDelegate委托协议方法
func textView(textView:UITextView,shouldChangeTextInRange range:NSRange,replacementText text:String)->Bool {
if text == "\n"{
textView.resignFirstResponder()//键盘打开
return false
}
return true
}
}
3.开关控件、分段控件和滑块控件
class ViewController:UIViewController{
var leftSwitch:UISwitch!
var rightSwitch:UISwitch!
var sliderValue:UILabel!
override func viewDidLoad(){
super.viewDidLoad()
let screen = UIScreen.main.bounds
let switchScreenSpace:CGFloat = 39 //设置左右边距
//添加rightSwitch控件
self.rightSwitch = UISwitch()
var frame = self.rightSwitch.frame
frame.origin = CGPoint(x:switchScreenSpace,y:98)
self.rightSwitch.frame = frame
self.rightSwitch.isOn = true
self.rightSwitch.addTarget(self,#selector(switchValueChanged(_:)),for:.valueChanged)
self.view.addSubView(self.rightSwitch)
//添加leftSwitch控件
self.leftSwitch = UISwitch()
frame = self.leftSwitch.frame
frame.origin = CGPoint(x:(screen.size.width - (frame.size.width + switchScreenSpace),y:98)
self.leftSwitch.frame = frame
self.leftSwitch.isOn = true
self.leftSwitch.addTarget(self,#selector(switchValueChanged(_:)),for:.valueChanged)
self.view.addSubView(self.leftSwitch)
//添加segmentedControl控件
let segments = ["right","left"]
let segmentedControl = UISegmentedControl(items:segments)
let scWidth:CGFloat = 220
let scHeight:CGFloat = 29
let scTopView:CGFloat = 186
frame = CGRect(x:(screen.size.width - scWidth)/2,
y:scTopView,
width:scWidth,
height:scTopView)
segmentedControl.frame = frame
segmentedControl.addTarget(self,#selector(touchDown(_:)),for:.valueChanged)
self.view.addSubView(segmentedControl)
//添加slider控件
let siderWidth:CGFloat = 300
let silderHeight:CGFloat = 31
……
slider.minimumValue = 0.0
slider.maximumValue = 100.0
slider.value = 50.00
slider.addTarget(self,action:#selector(sliderValueChange(_:)),for:.valueChanged)
self.view.addSubView(slider)
}
@objc func switchValueChanged(_ sender:AnyObject){
let witchSwitch = sender as! UISwitch
let setting = witchSwitch.isOn
self.leftSwitch.setOn(setting,animated:true)
self.rightwitch.setOn(setting,animated:true)
}
@objc func touchDown(_ sender:AnyObject){
let segmentedControl = sender as! UISegmentedControl
if self.leftSwitch.hidden == true {
self.rightSwitch.hidden = false
self.leftSwitch.hidden = false
}else{
self.rightSwitch.hidden = true
self.leftSwitch.hidden = true
}
}
@objc func sliderValueChange(_ sender:AnyObject){
let slider = sender as! UISlider!
let progressAsInt = Int(slider.value)
let nextText = String(format:"%d",progressAsInt)
self.slider.text = newText
}
}