Swift| 基础语法(五)

前言

总结下 swift下的基础语法,里面涉及到:常量&变量、Swift中的数据类型、逻辑分支、循环、字符串相关、数组和字典、方法的书写调用等内容,考虑到阅读体验分多篇来展示,希望对大家学习swift有所帮助,同时也是对自己的一个总结。

Swift| 基础语法(一) Swift| 基础语法(二) Swift| 基础语法(三) Swift| 基础语法(四) Swift| 基础语法(五)

本文涉及:

  • 纯代码创建应用根试图
  • UILabel、UIButton、UIImageView的使用
  • UITableView的使用
  • UITableView的使用
  • 单例
  • 从相册选择照片或者拍照

一、纯代码创建应用根试图

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    // 创建UIWindow对象,并初始化该窗口的大小与主屏幕大小相同
    let rect : CGRect = UIScreen.main.bounds
    // 程序将创建的UIWindow对象赋值给该程序委托对象的window属性
    self.window = UIWindow(frame:rect)
    // 创建ViewController对象、并使用ViewController界面布局文件来
    // 初始化该视图控制器关联的用户界面
    let vc = ViewController()
    //通过控件加载视图
    //let vc = ViewController(nibName: "ViewController", bundle: nil)   bundle:nil];
    // 让该程序的窗口加载、并显示viewController视图控制器关联的用户界面
    self.window?.rootViewController = vc
    //设置背景颜色
    self.window?.backgroundColor = UIColor.white
    // 将该UIWindow对象设为主窗口、并显示出来
    self.window?.makeKeyAndVisible()
    return true
}

二、UILabel、UIButton、UIImageView的使用

    let mylabel = UILabel(frame:CGRect.init(x: 30, y: 100, width: 100, height: 30))
    mylabel.text = "标签"
    mylabel.backgroundColor = UIColor.orange
    mylabel.textColor = UIColor.black
    
    let but = UIButton.init(frame: CGRect.init(x: 30, y: 200, width: 50, height: 50))
    but.setTitle("按钮", for: .normal)
    but.backgroundColor = UIColor.gray
    but.addTarget(self, action: #selector(buttonClick(_:)), for: .touchUpInside)
    
    let imageV = UIImageView.init(frame: CGRect.init(x: 30, y: 300, width: 80, height: 80))
    imageV.image = UIImage.init(named: "xixi")
    
    let sc = UIScrollView.init(frame: CGRect.init(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height));
    sc.contentSize = CGSize.init(width: UIScreen.main.bounds.width, height: 1000)
    self.view.addSubview(sc)
    
    sc.addSubview(mylabel)
    sc.addSubview(but)
    sc.addSubview(imageV)

  //  按钮的点击事件
  @objc func buttonClick(_ button:UIButton) -> () {
        let butTitle:String = button.title(for: .normal)!
        print("按钮点击了: \(butTitle)")
    }

三、UITableView的使用

var myTb : UITableView?

override func viewDidLoad() {
    super.viewDidLoad()
    
    title = "Tb 测试"
    myTb = UITableView.init(frame: UIScreen.main.bounds)
    myTb?.dataSource = self
    myTb?.delegate = self
    myTb?.backgroundColor = UIColor.white
    view.addSubview((myTb)!)
    myTb?.tableFooterView = UIView()
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let indentifier = "myCell"
    var cell:MyNewTableViewCell? = tableView.dequeueReusableCell(withIdentifier: indentifier) as? MyNewTableViewCell
    if cell == nil {
        //自定义cell使用此方法
        cell = MyNewTableViewCell(style: .subtitle, reuseIdentifier: "cellId")
        //xib加载cell使用此方法
        // cell = Bundle.main.loadNibNamed("testCell", owner: nil, options: nil)?.last as? UITableViewCell
    }
    cell?.label1?.text = "label1 :\(indexPath.row)"
    cell?.label2?.text = "label2 :\(indexPath.row)"
    return cell!
}

在Swift中,创建tableViewCell的方法可以分为两种创建tableView时候注册和需要使用时手动创建。先聊聊创建tableView的时候直接注册cell:

myTb?.register(MyNewTableViewCell.self, forCellReuseIdentifier: "myCell")

当注册了Cell之后,在没有可重用的Cell时会自动创建,并且不能在需要时手动创建。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    //创建cell,不需要判断是否为空,当没有可重用cell的时候会自动创建
    let cell:MyNewTableViewCell = (tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as? MyNewTableViewCell)!
    cell.label1?.text = "label1 :\(indexPath.row)"
    cell.label2?.text = "label2 :\(indexPath.row)"
    return cell
}

可以在自定义cell中处理点击状态下的显示

var label1 :UILabel?
var label2 :UILabel?

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    
    label1 = UILabel.init(frame: CGRect.init(x: 20, y: 10, width: 80, height: 20))
    label2 = UILabel.init(frame: CGRect.init(x: 20, y: 30, width: 80, height: 20))
    contentView.addSubview(label1!)
    contentView.addSubview(label2!)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

//点击情况下的显示处理
override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    if selected == true {
        contentView.backgroundColor = UIColor.yellow
        DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+0.4) {
            self.contentView.backgroundColor = UIColor.white
        }
    }
   
}

四、UITabBarController的使用

 func rootTabbarViewController() -> UITabBarController {
    
    // 首页
    let vc01 = ViewController()
    vc01.title = "首页"
    let nav01 = UINavigationController(rootViewController: vc01)
    // 发现
    let vc02 = UIViewController()
    vc02.title = "发现"
    let nav02 = UINavigationController(rootViewController: vc02)
    
    // 设置标题,未选中状态图标,选中状态图标
    let barItem01 = UITabBarItem(title: nil, image: UIImage(named: "TabBarItem_nomal_0")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "TabBarItem_light_0")?.withRenderingMode(.alwaysOriginal))
    vc01.tabBarItem = barItem01
    let barItem02 = UITabBarItem(title: nil, image: UIImage(named: "TabBarItem_nomal_1")?.withRenderingMode(.alwaysOriginal), selectedImage: UIImage(named: "TabBarItem_light_1")?.withRenderingMode(.alwaysOriginal))
    vc02.tabBarItem = barItem02
    
    let tabbarController = UITabBarController()
    tabbarController.tabBar.barTintColor = UIColor.white
    // 注意:视图控制器超过5个时(不包含5)会自动生成一个more视图标签,用来控制第5、6、...以后的视图控制器。
    tabbarController.viewControllers = [nav01, nav02]
    // 属性设置
    // 设置默认被选中视图控制器
    tabbarController.selectedIndex = 0;
    // 设置切换视图 tabBar 属性
    // 1 打开用户交互
    tabbarController.tabBar.isUserInteractionEnabled = true;
    // 2 设置背景颜色
    tabbarController.tabBar.backgroundColor = UIColor.black
    tabbarController.tabBar.barTintColor = UIColor.white
//        // 3 设置背景图片
//        tabbarController.tabBar.backgroundImage = UIImage(named: "")
//        // 4 选中时的背景图片
//        tabbarController.tabBar.selectionIndicatorImage = UIImage(named: "")
    
    // 设置字体颜色
    UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.gray], for: UIControlState.normal)
    UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.green], for: UIControlState.selected)
    // 设置字体大小
    UITabBarItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont.systemFont(ofSize: 10.0)], for: UIControlState.normal)
    // 设置字体偏移
    //   UITabBarItem.appearance().titlePositionAdjustment = UIOffsetMake(0.0, -5.0)
    // 设置图标选中时颜色
    UITabBar.appearance().tintColor = UIColor.clear

    return tabbarController
}

这里特别说明下:默认未选中标签的图片和文字是灰色的,选中的是蓝色的,下面修改成橙色:

 //图片文字一起变色
 self.tabBar.tintColor = UIColor.orangeColor()

如何显示原始图片的颜色和图案? .imageWithRenderingMode(.AlwaysOriginal) 即可。

五、单例

class AppManager {
private static let _sharedInstance = AppManager()
 
class func getSharedInstance() -> AppManager {
    return _sharedInstance
}
  private override init() {} // 私有化init方法
}

//使用方式
AppManager.getSharedInstance()


为什么需要保证INIT的私有化? 

因为只有init()是私有的,才能防止其他对象通过默认构造函数直接创建这个类对象,确保你的单例是真正的独一无二。 
因为在Swift中,所有对象的构造器默认都是public,所以需要重写你的init让其成为私有的。
这样就保证像如下的代码编译报错,不能通过。

六、从相册选择照片或者拍照

import UIKit

class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
    
    var uploadAlertController : UIAlertController?
    var pick:UIImagePickerController?
    var imageV :UIImageView?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.backgroundColor = UIColor.gray
        
        imageV = UIImageView.init(frame: CGRect.init(x: 30, y: 300, width: 80, height: 80))
        self.view.addSubview(imageV!)
        initAlertController()
        tapImage()
       
    }
    func initAlertController()
    {
        weak var blockSelf = self
        uploadAlertController = UIAlertController(title:nil, message: nil, preferredStyle:UIAlertControllerStyle.actionSheet)
        let takePhoto = UIAlertAction(title:"拍照", style:UIAlertActionStyle.default) { (action:UIAlertAction)in
            blockSelf?.actionAction(action: action)
        }
        let photoLib = UIAlertAction(title:"从相册选择", style:UIAlertActionStyle.default) { (action:UIAlertAction)in
            blockSelf?.actionAction(action: action)
        }
        let cancel = UIAlertAction(title:"取消", style:UIAlertActionStyle.cancel) { (action:UIAlertAction)in
            blockSelf?.actionAction(action: action)
        }
        uploadAlertController?.addAction(takePhoto)
        uploadAlertController?.addAction(photoLib)
        uploadAlertController?.addAction(cancel)
    }
    func tapImage(){
        present(uploadAlertController!, animated:true, completion: nil)
        initImagePickerController()
    }
    func initImagePickerController()
    {
        pick = UIImagePickerController()
        pick?.delegate = self
        // 设置是否可以管理已经存在的图片或者视频
        pick?.allowsEditing = true
    }
    func actionAction(action:UIAlertAction)
    {
        if action.title == "拍照" {
            self.getImageFromCamera(type: .camera)
        }else if action.title == "从相册选择" || action.title == "更换头像" {
            self.getImageFromPhotoLib(type: .photoLibrary)
        }
    }
    //拍照
    func getImageFromCamera(type:UIImagePickerControllerSourceType)
    {
        
        pick?.sourceType = type
        self.present(pick!, animated: true, completion:nil)
    }
    //相册选择
    func getImageFromPhotoLib(type:UIImagePickerControllerSourceType)
    {
        pick?.sourceType = type
        self.present(pick!, animated: true, completion:nil)
    }
    //MARK:- UIImagePickerControllerDelegate
    func imagePickerController(_ picker:UIImagePickerController, didFinishPickingMediaWithInfo info: [String :Any]){
        
        let type:String = (info[UIImagePickerControllerMediaType]as!String)
        //当选择的类型是图片
        if type == "public.image"
        {
            let img = info[UIImagePickerControllerOriginalImage]as?UIImage
            imageV?.image = img
        }
        picker.dismiss(animated:true, completion:nil)
    }
    
    func imagePickerControllerDidCancel(_ picker:UIImagePickerController){
        picker.dismiss(animated:true, completion:nil)
    }
    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coding...

Objective-C AVPlayer播放视频的使用与封装大致效果界面搭建Demo地址

看下成员变量就知道我怎么搭建的了,这里我将video播放层的size作为参照量,对所有控件的size按照其video的size宽高进行比例缩放

15740
来自专栏Python疯子

Swift - 给TableView添加编辑功能(删除,插入)

1,下面的样例是给表格UITableView添加编辑功能: (1)给表格添加长按功能,长按后表格进入编辑状态 (2)在编辑状态下,第一个分组处于删除状态,第...

36320
来自专栏知无涯

js判断手机浏览器操作系统及微信浏览器的方法

601100
来自专栏進无尽的文章

UI篇-UITabBar及其相关其他知识

和UINavigationController类似,UITabBarController也可以轻松地管理多个控制器,轻松完成控制器之间的切换。

33520
来自专栏老司机的简书

老司机出品———疯狂造轮子之滑动验证码

消失了好久,大家放心,我还活着。 要问我为什么消失了这么久,如果你知道什么叫封闭开发或许你会懂我。

25330
来自专栏hrscy

自定义UITextView

自定义UITextView,带有placeholeder,可以设置placeholeder文字的大小和颜色。

9720
来自专栏编程语言

iOS:宏定义(项目初期配置)(一)

18720
来自专栏freesan44

ios实战-runloop实现的同步弹窗

我们知道UIAlertView使用delegate返回数据实现的,使用麻烦,之前介绍过用Block实现的例子《ios实战-使用Block的UIAlertView...

14020
来自专栏陈满iOS

iOS自定义UICollectionView和UITableView单元格选中样式

32530
来自专栏TechBox

史上最全的iOS之UITextView实现placeHolder占位文字的N种方法前言方法一方法二方法三方法四方法五

22530

扫码关注云+社区

领取腾讯云代金券