文档章节

iOS Swift4项目EFarm学习和总结

iShown
 iShown
发布于 2017/09/22 15:46
字数 1810
阅读 402
收藏 4

Swift项目

先上一个码云地址 码云地址

项目的简单介绍

    Constant 模块
        AppUrl : 定义url静态变量
        PublicConstant : 定义cellidentifier, ScreenWidth等变量, BaseColor等变量, 封装view的一些属性(.width等), UIDevice分类判断iPhone X

    MianCode 模块
        各个模块 每个模块分位四块:controller(界面跳转,view切换), control(数据下载, 解析model), model(model申明), cell(view)    
 
    General 模块
        UserInfo : 示例封装set/get UserDefaults   
        RootController : 封装侧滑界面 (这是本项目的第一个类, 也是我开始学习swift的第一个类, 包含基本语法的注释)

    Library 模块
        示例使用OC混编, 没有使用CocoaPod的第三方库
        包括 : MJRefresh, DZNEmptyDataSet 等

    Resouce 模块
        图片文件
        
    Config模块
        项目初始文件

    Pod
        'Alamofire'      网络请求
        'SwiftyJSON'     Json解析
        'Kingfisher'     image缓存
        'PKHUD'          加载动画

  • 项目编写过程和一些知识点

这个项目从Xcode的singleView模板创建而来, 经过文件整理归类和修改创建了一个标准易于维护的最终模板, 你可以通过以下链接学习 ###一步一步创建一个标准的iOS项目模板

第一个swift类

在从github和码云上浏览了几个Swift项目之后我开始了自己的尝试.

例如 翔妖除魔 / ZhiHuDaily-Swift

例如 LinXunFeng / LXFWeChat

开始动手时候却发现Swift和OC很是不一样, 不知道swift的成员变量怎么"声明", oc中常用的类别, 类方法成员方法等等

1. Swift变量

参考资料关于Swift 你可能连变量都不会定义

swift变量有两种类型 : 存储变量 和 计算变量

存储变量

用于给一个对象增加属性, 可以在创建的时候就赋值(table)

    // 例如某个model的一个"属性"
    let title : String

    //例如vc的tableView
    let tableView : UITableView = {
        let table = UITableView.init(frame: CGRect.init(x: 0, y: 0, width: ScreenWidth, height: ScreenHeight), style: UITableViewStyle.grouped)
        table.backgroundColor = BackColor
        //这个时候创建时候self还没有初始化完成,不能self.addsubview
        return table
    }()

计算变量

用于监听变量值变化的时候执行相应的操作

//userInfo本地保存用户相关
class UserInfo: NSObject {

    //计算属性
    static var UserName : String? {
        //获取值,可能没有代码提示
        get{
            return UserDefaults.standard.value(forKey: UserNameKey) as? String
        }
        //设置值
        set(arr){
            UserDefaults.standard.set(arr, forKey: UserNameKey)
        }
    }
}

2. 实例方法(变量)和类型方法(变量)

参考资料 实例方法和类型方法

swift默认就是在其他地方可以访问的, 相当于oc中.h的变量

使用private那么只能在当前类使用, 同一swift文件也不可以

使用fileprivate在一个swift文件可以访问

class RootController: UIViewController {
    
    // MARK: - 单例写法
    //单例/类成员变量,只读,访问获取单例
    static let shareSingleton = RootController();
    
    // MARK: - 外部变量,外部可以赋值
    //main vc
    var mainVC : UIViewController = UIViewController() {
        didSet {
            //此时mainVC已经有值,做一些处理
            
        }
    //private修饰的内部变量
    private var leftView : UIView = {
        let view = UIView.init(frame: CGRect.init(x: 0, y: 64, width: 20, height: ScreenHeight-64))
        return view
    }()
}

3. 单例写法

参考资料单例写法

例如上边的"shareSingleton"静态变量就是Swift中标准的单例写法了, 具体可以查看上边的链接了解

4. Swift命名和代码风格, 避免OC风格的代码

简单了解一些之后, 就需要看看swift代码怎么写才更好, 好的代码 看起来总是赏心悦目的

参考资料

Swift命名和代码风格

5. 类别扩展(Extension)

参考资料类别扩展(Extension)

delegate方法写在扩展哩

为系统类扩展方法

public extension UIView {
    //只读属性, 不写set就是只读
    var left : CGFloat {
        get{
            return self.frame.origin.x
        }
//        set{
//        }
    }
    //上述方式的简写
    var right : CGFloat {
        return self.frame.origin.x + self.frame.size.width
    }
}

6. 宏/全局静态变量

因为swift开放的属性所有类内部都可以访问无需引用头文件

所以只需要创建一个swift文件专门用于存储这些就可以了

import UIKit

//无参宏其实就是静态变量
let identifierTitle = "TableViewCellIdentifierTitle"

let ScreenWidth = UIScreen.main.bounds.size.width

let DetailColor = UIColor.init(red: 153/255.0, green: 153/255.0, blue: 153/255.0, alpha: 1)

//带参宏是没有了, 就用全局方法替代
public func ColorRGB(_ r: Int, _ g: CGFloat, _ b: CGFloat) -> UIColor {
    return UIColor.init(red: CGFloat(r)/255.0, green: CGFloat(g)/255.0, blue: CGFloat(b)/255.0, alpha: 1)
}

//也可以使用上边 5.代码中的这种写法标记只读
var ConfigTabHeight : CGFloat {
        return 120
    }

7. CGRect、CGSize和CGPoint

参考资料CGRect、CGSize和CGPoint

现在结构体里的属性也可以单独设置了,

view.frame.size.width = 100

8. Swift与oc混编

步骤十分简单, 排除第一次自动创建, 手动创建可以通过一下步骤:

1.创建一个.h文件

2.BuildSeting修改Objective-C Bridge Header的值为创建的文件, 拖过去即可(推荐使用"$(SRCROOT)"标记相对路径)

注意swift方法开放给oc要使用"@objc"标志

 //因为OC类NJRefresh调用,所以使用@objc开放给OC类
    @objc private func configData() -> Void {
    }

9. CocoaPod使用

像oc一样,导入之后在用到的地方导入头文件即可使用

import PKHUD

10. 其他的,凑个10

其他一些项目建议:

  1. 反朴归真,使用系统的nav或tab,体检更好
  2. 使用wkwebview代替uiwebview,体验更好
  3. 简单适配3dtouch, peek/pop让你的项目体验更好
  • TableView优化

起因手机更新iOS11之后发现首页tab滑动更加卡了, 于是查看了头条, 腾讯视频都发现好像确实没有10流畅.

然后发现系统设置的table也卡出了翔(iOS11.0的iPhone 设置->移动蜂窝网络), 苹果生动的当了一次反面教材.

  1. cell高度预先计算
  2. cell使用不同identifier, cellForRow应该只有一个赋值操作
  3. 特别复杂, 没法使用2的话可以采用绘制方法, github有很多轮子可以去研究一下
    //table优化

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    //这个方法会在加载cell反复调用, 不要进行耗时操作
        let model : HomeModel = homeData.news![indexPath.row]
        return model.cellHeight
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model : HomeModel = (homeData.news?[indexPath.row])!
        //也要尽量精简
        //不同的cell一定要设置不同的identifier
        var cell : HomeTableCell = HomeTableCell()
        if model.cellHeight == 80 {
            cell = tableView.dequeueReusableCell(withIdentifier: identifierTitle) as! HomeTableCell
            cell.setTitleView(model: model)
        }
        if model.cellHeight == 120 {
            cell = tableView.dequeueReusableCell(withIdentifier: identifierOnePic) as! HomeTableCell
            cell.setOnePicView(model: model)
        }
        if model.cellHeight == 140 {
            cell = tableView.dequeueReusableCell(withIdentifier: identifierThreePic) as! HomeTableCell
            cell.setThreePicView(model: model)
        }
        
        if !cell.isSetTouch {
            if #available(iOS 9.0, *) {
                if self.traitCollection.forceTouchCapability == UIForceTouchCapability.available {
                    self.registerForPreviewing(with: self, sourceView: cell)
                }
            }
            cell.isSetTouch = true
        }
        return cell
    }
  • iOS11和iPhone X

参考资料适配11

iOS11, 比较得注意会直接影响界面的就是 安全距离 和 tableView问题, tableview现在必须returen header和footerView

iPhone X:

X 的人机交互指南

在iPhone X系统会自动修改StatusBar与Tabbar的高度,Tabbar从49pt变为83pt。StatusBar由20pt变为了44pt, 打电话和wifi状态栏不会增高。


至此, 这篇博客就结束了, 整体来说Swift写起来并没有那么可怕, 有些地方比OC方便不止一点, 如果swift库找不到也可以使用混编方式, 而且3到4.0变化也不多了,是时候尝试开始Swift了

感谢各位赏脸

© 著作权归作者所有

iShown
粉丝 17
博文 67
码字总数 46936
作品 0
浦东
高级程序员
私信 提问
iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

iOS精选源码 LeeTagView 标签选择控件(http://www.code4app.com/thread-31033-1-1.html) 为您的用户显示界面添加美观的加载视图(http://www.code4app.com/thread-31038-1-1.html) Swift4: 可......

sunnyaigd
2018/09/19
31
0
iOS股票K线图、校园助手、适配iPhone X、版本检测等源码

iOS精选源码 快速创建menuItem控件 YHPhotoBrowser 优化的网络图片浏览 cocoaAsynSocket demo (包含客户端和服务端) SwipeMenuViewController现在支持iPhoneX和Swift4。 仿微信的提醒对话框 ...

sunnyaigd
2017/10/31
51
0
系统学习iOS动画之零:说明和目录

动画制作很有趣,可以为用户界面注入活力。 如果使用得当,动画可以向用户传达信息,并将用户注意力吸引到界面的重要部分。 之前也做过一些iOS动画,但一直没有系统学习过,这次我用RW网站的...

Andy_Ron
2018/12/21
0
0
iOS朋友圈,视频播放器、钓鱼小游戏、玻璃动画源码

iOS精选源码 模仿抖音App的ye m切换框架 将所有类型的推送封装成API,提供OC和Swift双版本调用demo2.0 波浪动画 【Swift/Objective-C】强劲的日期选择控件 利用Masonry 和YYlable ,FDTempla...

sunnyaigd
2017/11/06
17
0
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.4K
5

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部