Swift-基础

知识点

宏定义

无参数宏:
//oc中的宏定义
#define kIOS7   [UIDevice currentDevice].systemVersion.doubleValue>=7.0 ? 1 :0
#define kIOS8   [UIDevice currentDevice].systemVersion.doubleValue>=8.0 ? 1 :0
#define kScreenHeight     [UIScreen mainScreen].bounds.size.height
#define kScreenWidth      [UIScreen mainScreen].bounds.size.width
//转换成swift的写法
let kIOS7 = Double(UIDevice().systemVersion)>=7.0 ? 1 :0
let kIOS8 = Double(UIDevice().systemVersion)>=8.0 ? 1 :0
let kScreenHeight = UIScreen.mainScreen().bounds.size.height
let kScreenWidth = UIScreen.mainScreen().bounds.size.width

有参数的宏:
//oc写法
#define RGBCOLOR(r,g,b) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]
//swift中的写法
func RGBCOLOR(r:CGFloat,_ g:CGFloat,_ b:CGFloat) -> UIColor
{
    return UIColor(red: (r)/255.0, green: (g)/255.0, blue: (b)/255.0, alpha: 1.0)
}

页面跳转

 window = UIWindow(frame: UIScreen.main.bounds)
 let homeVC = HomeViewController()
let nav = UINavigationController(rootViewController : homeVC)
window?.rootViewController = nav
window?.makeKeyAndVisible()

// present方式
let assetsViewController = AssetsViewController()
present(assetsViewController, animated: true, completion: nil)
// dismiss返回
dismiss(animated: true, completion: nil)

// push方式
self.navigationController?.pushViewController(AssetsViewController(), animated: true)
// pop返回
self.navigationController?.popViewController(animated: true)

字符串

1.遍历字符串
let str = "hello world"
        for c in str.characters{
            print(c)
        }

2.拼接字符串
        let str1 = "hello"
        let str2 = "world"
        let str3 = str1+str2
        let info = "my name is\(str)"

3.字符串截取
        let header = (str as NSString).substring(to: 3)
        let body = (str as  NSString).substring(with:NSRange(location:4,length:3))
        let bodyy = (str as NSString).substring(from: 4)

控件

UILabel

let label = UILabel(frame:CGRect(x:10, y:20, width:300, height:100))
        label.text = "hangge.com"
        self.view.addSubview(label)

背景颜色和文字颜色的设置
label.textColor = UIColor.white //白色文字
label.backgroundColor = UIColor.black //黑色背景

对齐方式的设置
label.textAlignment = .right//文字右对齐

文字阴影的设置
label.shadowColor = UIColor.gray  //灰色阴影
label.shadowOffset = CGSize(width:1.5, height:1.5)  //阴影的偏移量

字体的设置
label.font = UIFont(name:"Zapfino", size:20)

文字过长时的省略方式
label.lineBreakMode = .byTruncatingTail  //隐藏尾部并显示省略号
label.lineBreakMode = .byTruncatingMiddle  //隐藏中间部分并显示省略号
label.lineBreakMode = .byTruncatingHead  //隐藏头部并显示省略号
label.lineBreakMode = .byClipping  //截去多余部分也不显示省略号

文字大小自适应标签宽度
label.adjustsFontSizeToFitWidth = true //当文字超出标签宽度时,自动调整文字大小,使其不被截断

使标签可以显示多行文字
label.numberOfLines = 2  //显示两行文字(默认只显示一行,设为0表示没有行数限制)

设置文本高亮
//设置文本高亮
label.isHighlighted = true
//设置文本高亮颜色
label.highlightedTextColor = UIColor.green

富文本设置
//富文本设置
let attributeString = NSMutableAttributedString(string:"感谢18888位用户的信任,累积交易额达\n 22222266666元")
// 颜色        attributeString.addAttribute(NSAttributedStringKey.foregroundColor, value: UIColor.red,range: NSMakeRange(2,5))
// 大小
attributeString.addAttribute(NSAttributedStringKey.font, value: UIFont.systemFont(ofSize: 16), range: NSMakeRange(20,13))
Label.attributedText = attributeString

UIImageView

let imageView = UIImageView(image:UIImage(named:"image1"))
imageView.frame = CGRect(x:10, y:30, width:300, height:150)
self.view.addSubview(imageView)

改变图片
imageView.image = UIImage(named:"icon2")

从文件目录中获取图片
let path = Bundle.main.path(forResource: "ball", ofType: "png")
let newImage = UIImage(contentsOfFile: path!)
let imageView = UIImageView(image:newImage)
self.view.addSubview(imageView)

从网络地址获取图片
//定义URL对象
let url = URL(string: "http://hangge.com/blog/images/logo.png")
//从网络获取数据流
let data = try! Data(contentsOf: url!)
//通过数据流初始化图片
let newImage = UIImage(data: data)
let imageView = UIImageView(image:newImage);
self.view.addSubview(imageView)

保持图片比例 :
imageView.contentMode = .scaleAspectFit

使用图像控件实现动画播放
UIImageView 中提供了存储多张图片来创建动画的功能,具体做法是,在 animationImages 属性中设置一个图片数组,然后使用 startAnimating 方法开始动画,最后用 stopAnimating 方法停止动画。同时,使用 animationDuration 属性中可以设置动画每帧切换的速度(秒)。

var imageView:UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        imageView = UIImageView()
        imageView.frame=CGRect(x:20, y:20, width:100, height:100)
        //设置动画图片
        imageView.animationImages = [UIImage(named:"icon1")!,UIImage(named:"icon2")!]
        //设置每隔0.5秒变化一次
        imageView.animationDuration=0.5
        self.view.addSubview(imageView)
    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        imageView.startAnimating()
    }
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillAppear(animated)
        imageView.stopAnimating()
    }

UIButton

按钮有下面四种类型:
    UIButtonType.system:前面不带图标,默认文字颜色为蓝色,有触摸时的高亮效果
    UIButtonType.custom:定制按钮,前面不带图标,默认文字颜色为白色,无触摸时的高亮效果
    UIButtonType.contactAdd:前面带“+”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果
    UIButtonType.detailDisclosure:前面带“!”图标按钮,默认文字颜色为蓝色,有触摸时的高亮效果
    UIButtonType.infoDark:为感叹号“!”圆形按钮
    UIButtonType.infoLight:为感叹号“!”圆形按钮

//创建一个ContactAdd类型的按钮
let button:UIButton = UIButton(type:.contactAdd)
//设置按钮位置和大小
button.frame = CGRect(x:10, y:150, width:100, height:30)
//设置按钮文字
button.setTitle("按钮", for:.normal)
self.view.addSubview(button)

对于Custom定制类型按钮,代码可简化为:
let button = UIButton(frame:CGRect(x:10, y:150, width:100, height:30))

按钮的文字设置
button.setTitle("普通状态", for:.normal) //普通状态下的文字
button.setTitle("触摸状态", for:.highlighted) //触摸状态下的文字
button.setTitle("禁用状态", for:.disabled) //禁用状态下的文字

按钮文字颜色的设置
button.setTitleColor(UIColor.black, for: .normal) //普通状态下文字的颜色
button.setTitleColor(UIColor.green, for: .highlighted) //触摸状态下文字的颜色
button.setTitleColor(UIColor.gray, for: .disabled) //禁用状态下文字的颜色

按钮文字阴影颜色的设置
button.setTitleShadowColor(UIColor.green, for:.normal) //普通状态下文字阴影的颜色
button.setTitleShadowColor(UIColor.yellow, for:.highlighted) //普通状态下文字阴影的颜色
button.setTitleShadowColor(UIColor.gray, for:.disabled) //普通状态下文字阴影的颜色

按钮文字的字体和大小设置
button.titleLabel?.font = UIFont.systemFont(ofSize: 11)

按钮背景颜色设置
button.backgroundColor = UIColor.black

按钮文字图标的设置 :
默认情况下按钮会被渲染成单一颜色
button.setImage(UIImage(named:"icon1"),forState:.Normal)  //设置图标
button.adjustsImageWhenHighlighted=false //使触摸模式下按钮也不会变暗(半透明)
button.adjustsImageWhenDisabled=false //使禁用模式下按钮也不会变暗(半透明)

也可以设置成保留图标原来的颜色
let iconImage = UIImage(named:"icon2")?.withRenderingMode(.alwaysOriginal)
button.setImage(iconImage, for:.normal)  //设置图标
button.adjustsImageWhenHighlighted = false //使触摸模式下按钮也不会变暗(半透明)
button.adjustsImageWhenDisabled = false //使禁用模式下按钮也不会变暗(半透明)

设置按钮背景图片:
button.setBackgroundImage(UIImage(named:"bg1"), for:.normal)

按钮触摸点击事件响应:
//不传递触摸对象(即点击的按钮)
button.addTarget(self, action:#selector(tapped), for:.touchUpInside)
func tapped(){
     print("tapped")
}
//传递触摸对象(即点击的按钮),需要在定义action参数时,方法名称后面带上冒号
button.addTarget(self, action:#selector(tapped(_:)), for:.touchUpInside)
func tapped(_ button:UIButton){
     print(button.title(for: .normal))
}

touchDown:单点触摸按下事件,点触屏幕
touchDownRepeat:多点触摸按下事件,点触计数大于1,按下第2、3或第4根手指的时候
touchDragInside:触摸在控件内拖动时
touchDragOutside:触摸在控件外拖动时
touchDragEnter:触摸从控件之外拖动到内部时
touchDragExit:触摸从控件内部拖动到外部时
touchUpInside:在控件之内触摸并抬起事件
touchUpOutside:在控件之外触摸抬起事件
touchCancel:触摸取消事件,即一次触摸因为放上太多手指而被取消,或者电话打断

按钮文字太长时的处理方法:
默认情况下,如果按钮文字太长超过按钮尺寸,则会省略中间的文字。比如下面代码:
let button = UIButton(frame:CGRect(x:20, y:50, width:130, height:50))
button.setTitle("这个是一段 very 长的文字", for:.normal) //普通状态下的文字
button.setTitleColor(UIColor.white, for: .normal) //普通状态下文字的颜色
button.backgroundColor = UIColor.orange
self.view.addSubview(button)

//省略尾部文字
button.titleLabel?.lineBreakMode = .byTruncatingTail

UIAlertController

// 弹出
 let alertController = UIAlertController(title:"联系方式",message:"185-5242-8862",preferredStyle: .alert)
        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
        let okAction = UIAlertAction(title: "确定", style: .default, handler:{
            (UIAlertAction) -> Void in
            print("点击确定事件")
        })
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)

// 上滑
let alertController = UIAlertController(title: "保存或删除数据", message: "删除数据将不可恢复",
                                                preferredStyle: .actionSheet)
        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
        let deleteAction = UIAlertAction(title: "删除", style: .destructive, handler: nil)
        let archiveAction = UIAlertAction(title: "保存", style: .default, handler: nil)
        alertController.addAction(cancelAction)
        alertController.addAction(deleteAction)
        alertController.addAction(archiveAction)
        self.present(alertController, animated: true, completion: nil)

//按钮使用“告警”样式
let okAction = UIAlertAction(title: "好的", style: .destructive, handler: nil)

//添加任意数量文本输入框
  let alertController = UIAlertController(title: "系统登录",
                            message: "请输入用户名和密码", preferredStyle: .alert)
        alertController.addTextField {
            (textField: UITextField!) -> Void in
            textField.placeholder = "用户名"
        }
        alertController.addTextField {
            (textField: UITextField!) -> Void in
            textField.placeholder = "密码"
            textField.isSecureTextEntry = true
        }
        let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)
        let okAction = UIAlertAction(title: "好的", style: .default, handler: {
            action in
            //也可以用下标的形式获取textField let login = alertController.textFields![0]
            let login = alertController.textFields!.first!
            let password = alertController.textFields!.last!
            print("用户名:\(login.text) 密码:\(password.text)")
        })
        alertController.addAction(cancelAction)
        alertController.addAction(okAction)
        self.present(alertController, animated: true, completion: nil)

// 使用代码移除提示框
self.presentedViewController?.dismiss(animated: false, completion: nil)

// 提示框弹出后,过段时间自动移除
let alertController = UIAlertController(title: "保存成功!",
                                        message: nil, preferredStyle: .alert)
self.present(alertController, animated: true, completion: nil)
//两秒钟后自动消失
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
    self.presentedViewController?.dismiss(animated: false, completion: nil)
}

UITableView

// tableView
        let tableView = UITableView(frame:UIScreen.main.bounds)
        tableView.backgroundColor = UIColor.darkGray
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UINib (nibName: "HomeCell", bundle: nil), forCellReuseIdentifier: "HomeCell")
        view.addSubview(tableView)
// tableView-headView
        let headView : UIView = UIView(frame:CGRect(x:0,y:0,width:screenW,height:120))
        headView.backgroundColor = UIColor.yellow
        tableView.tableHeaderView = headView
 // tableView - footView
        tableView.tableFooterView = UIView()

UINavigationController

let navgationController = UINavigationController(rootViewController: viewC);
//设置导航栏的统一的背景色

  UINavigationBar.appearance().barTintColor = UIColor.blueColor();
// 设置导航栏的背景色

navgationController.navigationBar.barTintColor = UIColor.yellowColor();
//设置导航栏的样式

navgationController.navigationBar.barStyle = UIBarStyle.BlackTranslucent;
//设置导航栏透明

navgationController.navigationBar.translucent = true;
//设置导航栏的背景图

 navgationController.navigationBar.setBackgroundImage(UIImage(named: ""), forBarMetrics: UIBarMetrics.Default);
//获取控制器中最顶端的视图

  let topViewC = self.navigationController?.topViewController;
//获取控制器当前显示的视图

 let currentViewC = self.navigationController?.visibleViewController;
//获取当前控制器所有的子视图

let viewAarray = self.navigationController?.viewControllers;
//设置prompt属性,主要是用来做一些提醒,比如网络请求,数据加载等等

 self.navigationItem.prompt = "正在加载数据";
//不用时,将prompt属性置为nil即可,自带动画效果哦
  self.navigationItem.prompt = nil;

1,签订代理
self.navigationController?.delegate = self;
2,常用代理方法
1):视图控制器将要显示时调用
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
    
}
2):视图控制器已经显示时调用
func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) {
    
}
四:自定义navigationBarItem
navigationItem常用的属性

    //自定义左侧一个按钮时使用
    self.navigationItem.leftBarButtonItem
    //自定义左侧多个按钮时使用
    self.navigationItem.leftBarButtonItems
    //自定义右侧一个按钮时使用
    self.navigationItem.rightBarButtonItem
    //自定义右侧多个按钮时使用
    self.navigationItem.rightBarButtonItems
    //中间显示的标题文字
    self.navigationItem.title
  //自定义中间部分标题视图时使用
    self.navigationItem.titleView

例如:
let item = UIBarButtonItem(title: "done", style: UIBarButtonItemStyle.Done, target: self, action: "done:");
self.navigationItem.leftBarButtonItem = item;
UIBarButtonItem有三种创建方式
1):带标题的
  public convenience init(title: String?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector)
2):带图片的
  public convenience init(image: UIImage?, landscapeImagePhone: UIImage?, style: UIBarButtonItemStyle, target: AnyObject?, action: Selector) 
3:带自定义视图的
public convenience init(customView: UIView)

实例

UITableView

1.xib创建cell:
import UIKit
class HomeViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        configHomeViewControllerUI()
        print("who are you ")
    }

    func configHomeViewControllerUI(){
        view.backgroundColor = UIColor.green

        let tableView = UITableView(frame:UIScreen.main.bounds)
        tableView.dataSource = self
        tableView.delegate = self
        tableView.register(UINib (nibName: "HomeCell", bundle: nil), forCellReuseIdentifier: "HomeCell")
        view.addSubview(tableView)
        tableView.tableFooterView = UIView()
    }

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 12
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell : HomeCell = tableView.dequeueReusableCell(withIdentifier: "HomeCell") as! HomeCell
        cell.name.text = "hello homecell"
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("present VC")
self.navigationController?.pushViewController(AssetsViewController(), animated: true)
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


2.自带cell样式:
import UIKit
class AssetsViewController: UIViewController,UITableViewDataSource,UITableViewDelegate {
    override func viewDidLoad() {
        super.viewDidLoad()
        configAssetsViewControllerUI()
    }

    func configAssetsViewControllerUI(){

        view.backgroundColor = UIColor.orange

        let tableView = UITableView(frame :UIScreen.main.bounds)
        tableView.dataSource = self
        tableView.delegate = self
        view.addSubview(tableView)
    }
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 15
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let initIdentifier = "AssetsCell"
        let cell = UITableViewCell(style:UITableViewCellStyle.subtitle,reuseIdentifier:initIdentifier)
        cell.textLabel?.text = "who are you ?\(indexPath.row)"
        cell.detailTextLabel?.text = "Kitty"
        return cell
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,082评论 1 32
  • 有一定iOS基础的小伙伴们一定知道,在开发的过程中UI控件是必不可少的。那么在swift中UI控件都是怎么创建和使...
    Mr_fei阅读 1,128评论 0 3
  • 前言 总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、...
    進无尽阅读 1,309评论 0 2
  • 简介 特点(1)优于OC,快速,安全(2)取消了预编译指令包括宏定义(OC用的太多了)(3)取消了OC指针和不安全...
    洛洛爱吃肉阅读 903评论 0 3
  • 1. “哎,吴雷,今天走在路上一个女孩一直盯着我看,我也盯着她看。 她还对我笑,我就不好意思的转移了视线,脸都红的...
    Ray丶阅读 948评论 0 1