美文网首页
完整Swift项目(模拟微博)演练、一

完整Swift项目(模拟微博)演练、一

作者: 下班不写程序 | 来源:发表于2020-03-25 21:35 被阅读0次

我将整个项目的复习拆分成了几个部分, 每完成一部分我都会提交一次代码, 大家根据所复习到的部分, 检出对应的分支来看代码就可以了, 代码中的注释已经十分详尽了, 有问题或者疑惑大家可以随时留言沟通.
项目地址

涵盖的知识点:
1.界面介绍
2.梳理整个项目的框架结构
3.配置App Icons和Launch Images
4.占位符 '_'
5.KVC为私有属性赋值
6.自定义tabBar内部子控件约束
7.Swift 中的extension
8.为函数参数设置默认值
9.自定义导航栏
10.问题分析:TabBar文字选中颜色Push一个页面,在pop回来之后就变成系统的蓝色的。

首页.PNG 首页右上角点击扫描跳转页.PNG 拖拽返回.PNG
1. 梳理整个项目的框架结构
/** MVVM 文件夹结构
 - Model
 - ViewModel
 - View(nav+tab、首页、消息、发现、我)
    - Main (nav+tab等)
        - View
        - ViewController
    - Home (首页)
        - View
        - ViewController
    - Message (消息)
        - View
        - ViewController
    - Discover (发现)
        - View
        - ViewController
    - Mine (我)
        - View
        - ViewController
 */
2. 配置App Icons和Launch Images
Xcode11之后的图片.png

如上图, 对于App Icons的设置, 直接点击后面的箭头, 跳转后添加对应图片即可; 而在Xcode11之后你会发现缺少了 Launch Images Source选项, 所以导致无法去添加启动资源.

解决办法: 首先在Assets.xcassets添加启动图资源, 然后在工程 targets--Build Settings 搜索 Asset Catalog, 然后设置创建的启动页名字即可如下图所示. image.png
注意: 据说从2020年4月开始,使⽤ iOS13 SDK 的 App 将必须提供 LaunchScreen,而LaunchImage将退出历史的舞台,说明以后启动页要通过LaunchScreen来设置了
3. 涉及的知识点

知识点1: addChild(_ childController: UIViewController) 是系统原有的方法, 和下面写的只是参数不同, 所以叫重载构造函数!
知识点2: 当方法的参数的外部参数为占位符( _ )的时候, 调用该方法的时候就只显示你传入的数据, 其他的什么也不显示. ( _ )也可以删除, 删除之后再调用就和正常的参数一样显示参数名称了

知识点1、2.png
知识点3: 对于控制器设置标题时 知识点3.png
知识点4: KVC为私有属性赋值, key就是该类的属性名称!!! 知识点4.png
知识点5. 自定义tabBar内部子控件约束
自定义tabBar效果图.png
 override func layoutSubviews() {
        super.layoutSubviews()
        
        // 所有添加到tabBar上的item都是subView
        // 因为item要均分, 所以计算子控件的宽度 一共五个
        let w = UIScreen.main.bounds.size.width * 0.2
        // 确定子控件的位置
        var index: CGFloat = 0
        
        // 观察图层了解到, 被添加到tabBar上的item 为UITabBarButton类型, 所以遍历所有子控件, 找到在外界添加的item
        for view in subviews {
            
            // 判断类型是否为UITabBarButton (注: UITabBarButton为私有属性, .self获取不到该类型的class)
            if view .isKind(of: NSClassFromString("UITabBarButton")!) {
                
                // 重新设置item 的宽和x
                view.frame.size.width = w
                view.frame.origin.x = index * w
                
                index += 1
                
                // 给 加号按钮 预留出中心位置
                if index == 2 {
                    index += 1
                }
            }
        }
        
        // 设置加号按钮的约束
        plusButton.center.x = frame.width * 0.5
        plusButton.center.y = frame.height * 0.5
    }

知识点6: Swift中'分类'的创建及使用
1.command + N 打开创建文件面板
2.选择Swift File
3.填写有关联的命名

.png
  1. 修改import Foundation 为 import UIKit
  2. 写 extension 要拓展的类 { 自定义操作 } 例如给UIBarButtonItem添加分类.png
知识点7. 为函数参数设置默认值
// MARK: 为UIBarButtonItem 写extension
extension UIBarButtonItem {
    /** 构造便利函数 的 拓展
    -- UIBarButtonItem 可能有三种类型
        -- 纯图片
        -- 纯文字
        -- 图片 和 文字
     */
    // imageName: String? = nil 这种形式 就是参数为可选值 , 外界写不写该参数都可以, 且不写的话默认值为nil
    convenience init(imageName: String? = nil, title: String? = nil, target: Any?, action: Selector) {
        self.init()
        
        let button: UIButton = UIButton(type: UIButton.ButtonType.custom)
        button.addTarget(target, action: action, for: UIControl.Event.touchUpInside)
        
        // 因为传进来的imageName、title 均为可选值,
        // 所以需要使用 可选值判断 -> if let/var (注: 不用guard let/var 是因为判断完成之后, 其他参数还会有后续操作)
        if let img = imageName {
            button.setImage(UIImage(named: img), for: UIControl.State.normal)
            button.setImage(UIImage(named: "\(img)_highlighted"), for: UIControl.State.highlighted)
        }
        
        if let tit = title {
            button.setTitle(tit, for: UIControl.State.normal)
            button.setTitleColor(.darkGray, for: UIControl.State.normal)
            button.setTitleColor(.orange, for: UIControl.State.highlighted)
        }
        button.sizeToFit()
        
        // 注: 在外界创建 UIBarButtonItem 的时候是这样赋值的, 所以在这直接为 customView 赋值
//        navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
        customView = button
    }
}

例如调用时, 纯文字的item,imageName写不写都可以:

navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: nil, title: "PUSH", target: self, action: #selector(pushButtonClick))

navigationItem.rightBarButtonItem = UIBarButtonItem(title: "PUSH", target: self, action: #selector(pushButtonClick))

知识点8: 系统的导航控制器自定义左侧返回按钮, 会使拖拽屏幕左侧的返回功能失效(拖拽屏幕左侧的返回功能 是 iOS7.0之后才有的)
-- 解决方法: 自定义导航控制器
-- 原因: 当前导航栏的响应左侧拖拽的手势代理, 系统未设置成self

知识点9: UINavigationController 的 children 和 viewControllers

children 和 viewControllers.png
知识点10: 定义 common 文件, 类似于 OC 中的.pch文件
import UIKit
/**
 Swift 中所有文件全局共享, 没有 PCH 文件(类似于 OC 的.pch问价)
 */
// MARK: 屏幕尺寸相关
let KSCREENBOUNDS = UIScreen.main.bounds
let KSCREENWIDTH = KSCREENBOUNDS.width
let KSCREENHEIGHT = KSCREENBOUNDS.height

/// app 主题颜色
let THEMECOLOR = UIColor.orange
/// RGB 颜色
func RGB(r: Float, g: Float, b: Float, alpha: Float = 1) -> UIColor {
    return UIColor(red: CGFloat(r/Float(255)), green: CGFloat(g/Float(255)), blue: CGFloat(b/Float(255)), alpha: CGFloat(alpha))
}
/// 随机色
func HRandomColor() -> UIColor {
    let r = Float(arc4random() % 256)
    let g = Float(arc4random() % 256)
    let b = Float(arc4random() % 256)
    return RGB(r: r, g: g, b: b)
}
知识点11.

问题: TabBar文字选中颜色Push一个页面,在pop回来之后就变成系统的蓝色的。
解决: 是给UITabBarController设置默认值

// 这里的self是UITabBarController
self.tabBar.tintColor = selColor;

.End

相关文章

网友评论

      本文标题:完整Swift项目(模拟微博)演练、一

      本文链接:https://www.haomeiwen.com/subject/nkgoyhtx.html