ITPub博客

首页 > 移动开发 > IOS > Android工程师的IOS开发记录

Android工程师的IOS开发记录

原创 IOS 作者:山有木xi 时间:2023-09-09 17:30:54 0 删除 编辑

一、 snapkit 嵌套 scrollview

需要确定左右布局 , 因为是垂直滚动,参考代码如下

view.addSubview(scrollView)
        scrollView.snp.makeConstraints { (make) in
            make.edges.equalTo(view)
        }
        scrollView.addSubview(contentView)
        contentView.snp.makeConstraints { make in
            make.top.bottom.equalTo(scrollView)
            make.left.right.equalTo(view) // 确定的宽度,因为垂直滚动 }


二、 snapkit 无法滑动 中 scrollView 无法滑动

检查 scrollView 中最顶部布局是否有,参考代码如下

top.equalToSuperview()

检查布局底部是否有置底部,参考代码如下

bottom.equalToSuperview()


三、 snapkit 框架实现横向 "TableView"

在 iOS 开发中 TableView 的横向布局采用的普遍方案是讲 tableView 旋转 90 度后再将自定义 cell 逆时针旋转 90 度

tableView.transform = CGAffineTransformMakeRotation(-Double.pi / 2)
cell.transform = CGAffineTransformMakeRotation(.pi / 2)

而我们如果采用 snap kit 框架通过添加约束的方法进行横向布局会出现宽度错乱的问题 , 所以 , 我的解决方法是自己写个算法一个个添加子 View

核心解决算法参考如下

        for index in 0...topSelectUIViewArray.count-1{
            if index == 0{
                topSelectUIViewArray[index].snp.makeConstraints { make in
                    make.top.left.bottom.equalToSuperview()
                    make.width.equalTo(30)
                }
                //在 topSelectUIViewArray[index]这个view中可以继续添加布局,就像自定义cell一样
            }else{
                topSelectUIViewArray[index].snp.makeConstraints { make in
                    make.left.equalTo(topSelectUIViewArray[index].snp.right)
                    make.top.bottom.equalToSuperview()
                    make.width.equalTo(30)
                }
            }
        }


四、 当遇到数据量复杂的页面时 , 比如说局部横向滑动 , 局部上下滑动 , 就可以采用嵌套 UIViewController 的方案来解决,类似于Android中activity嵌套不同的fragment

container.addSubview(basketball.view)
        vc1.view.snp.makeConstraints { make in
            make.top.left.right.bottom.equalToSuperview()
        }
        vc1.didMove(toParent: self)


如果要去除可以使用

 vc1.willMove(toParent: nil)
            vc1.removeFromParent()
            vc1.view.removeFromSuperview()


五、 view 点按效果

这点 ios 跟安卓的区别很大 , 安卓官方提供了水波纹的功能实现点按效果 , 我的解决方案是自定义 view 来实现,参考代码如下

//
//  UIViewEffect.swift
//  competition
//
//  Created by cyy on 2023/8/7.
//
 
import UIKit
 
class UIViewEffect: UIView {
    var backColor = UIColor.white
    var effectColor = UIColor.colorWithHexString("#F2F3F5")
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        backColor = backgroundColor ?? UIColor.white
        self.backgroundColor = effectColor
    }
    
    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        UIView.animate(withDuration: 0.15, animations: { () -> id in
            self.backgroundColor = self.backColor
        })
    }
 
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        UIView.animate(withDuration: 0.15, animations: { () -> Void in
            self.backgroundColor = self.backColor
        })
    }
}

 

六、 ios 多文件分享和单个文件分享

当时做这个的时候遇到了很多的坑

self.documentInteractionController = UIDocumentInteractionController(url: shareurl)
                        self.documentInteractionController?.name = self.fileTypeArrary[row].name
                        self.documentInteractionController?.presentOptionsMenu(from: self.view.bounds, in: self.view, animated: true)


需要注意的是, documentInteractionController 这个类必须声明为全局变量 , 然后在局部方法中进行实例化 , 否则无法使用

var documentInteractionController: UIDocumentInteractionController?

上面的代码只能进行单个文件分享 , 如果需要分享多个文件的话 ,还需 要采用另外的方法,参考代码如下

let ui=UIActivityViewController(activityItems: [shareurl], applicationActivities: nil)
            self.present(ui, animated:true, completion: nil)


七、 iOS 自定义 UITableViewCell 宽度 320 问题

很多时候我们需要在自定义的 UITableViewCell 中进行宽度识别才能做 ui , 而在 UITableViewCell 初始化中默认的宽高永远是 320 * 44 , 网上的解决方案是在

  override func layoutSubviews() {
        initView()
    }

中进行 ui 操作 , 但是在这个方法中进行操作会导致频繁执行布局操作 , 当数据多时严重影响性能

解决方案是 , 在外部提前定义好真实的宽度并传入使用

 

八、 UITableView 去掉下划线需要在addSubview 之后执行

iOS 的 UITableView 每个 item 会默认有个下划线 , 如果要去除下划线的代码如下

方案1:
dataTableView.separatorStyle = UITableViewCell.SeparatorStyle.none
方案2:
tableView.separatorColor = .clear

个人推荐方案 1 , 无论 1 还是 2 都需要在 addSubview 后执行 , 否则无效

 

九、 UITableView 复用 布局 的问题

在 UITableView 的逻辑中 , 当创建多个 cell 并且屏幕显示不了所有的 cell 时,系统会将多余没有显示到的 cell 放入复用池 (reuse pool) 中,当需要新建 cell 并且标识符与复用池中的标识符存在相同的情况,就会调用复用池中的 cell ,并且会使用该 cell 的所有 UI 控件 , 在定义 UITableView 有个方法

TableView.register(NSClassFromString("UITableViewCell"), forCellReuseIdentifier: "TableViewCellId")

其中 TableViewCellId 就是固定的 id , 在自定义 cell 中加入 id 用于区分不同的 item 可以有效避免数据错乱的问题

var cell:TableViewCell?=tableView.dequeueReusableCell(withIdentifier: "TableViewCellId-\(indexPath.row)-\(indexPath.section)") as? TableViewCell


十、 有时候为了方便快速开发 , 服务端会直接把一段 html 代码发送给我们 , 我们在本地可以直接执行 ,ios 跟 Android 一样头提供了相关的方法 , 我把他们整理成一个扩展函数,参考代码如下

extension String {
 public func convertHtmlToAttributedStringWithCSS() -> NSAttributedString? {
     
        guard let data = self.data(using: .utf8) else {
            return nil
        }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }
        catch {
            print(error)
            return nil
        }
    }
}


十一、 遇到一个需求 , 在一个高度有限且固定的布局中需要放入不同尺寸的图片 , 并且图片不能拉伸 , 最开始尝试在设置的时候之设置长度不设置宽度 , 后来发现这样做没办法完成需求 , 最后解决方案

 imgViewArray[index].contentMode = .scaleAspectFit


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2982126/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle OCA(Java),IBM高级工程师认证,中国软件行业人才(高级c语言),高级Android工程师,对数据库并发与性能调优也有一定了解

注册时间:2019-04-25

  • 博文量
    147
  • 访问量
    390775