通过 clip-path 绘制各种图形

我们以前通过 border 那一套方案可以实现用 CSS 画出简单的图形(如:三角形、梯形、棱形等),但是受制于 border 属性的局限性,过于复杂的图形则无法通过 border 来实现。但是 clip-path 则不一样,不仅可以通过 circle()ellipse()inset() 函数实现简单的图形,还可以通过 polygon()path() 函数实现复杂的图形,甚至可以引用 SVG 的 <clipPath> 属性来实现更复杂的裁剪功能。

阅读更多 >>

echarts 在 Y 轴标签中显示图片

完整代码

通过 echarts 显示一个排名图表,在名称前面还需要给出对应的排名小图标用于区分。

阅读更多 >>

echarts 将图例(legend)拆分成左右两栏

在多数情况下,我们的图形报表中要么不显示图例组件,要么只是将图例组件固定在上/下/左/右的某一个方向上,但是现在有个需求,是需要将图例组件进行拆分成两栏,分别在左右两侧进行展示。

阅读更多 >>

Element-Plus 的表格组件(el-table)在 Chrome 72/73 的版本下不显示数据

前言

刚接手的项目在上周遇到个问题,同事反馈说在 Chrome 浏览器下,el-table 表格部分内容不显示,显示为空白。

第一时间就在我电脑上进行测试,发现一切没问题啊,显示正常,但是在同事电脑上确实未显示,控制台也无任何报错信息。

阅读更多 >>

升级 Xcode15 后老项目报错

升级到 Xcode15 后,打开老项目,编译时会遇到如下错误:

Assertion failed: (false && "compact unwind compressed function offset doesn't fit in 24 bits"), function operator(), file Layout.cpp, line 5758.

阅读更多 >>

CSS 子元素选择器(first-child/last-child/nth-child/nth-last-child)

虽然从事前端这么久了,但是也一直没怎么写过关于 CSS 的文章,今天我们就聊聊 CSS 子元素选择器。

开始之前,我们先创建一个初始化场景页面,以下是我们的示例开始的代码:

<script setup lang="ts">

阅读更多 >>

在 macOS/Linux 上查找大文件

有时候我们想要在某个目录下过滤出一些大文件,通过 find 命令,我们可以轻松实现这个需求。

1、在当前目录下,找出文件大小大于 1G 的文件(+表示大于)

find . -type f -size +1G

阅读更多 >>

macOS/Liunx 统计指定目录下的文件数量

仅限当前目录(不包含子目录以及隐藏文件)

  • 统计文档当前目录下的文件总数

阅读更多 >>

macOS读写NTFS格式的磁盘

当我们在 macOS 系统外接 NTFS 格式的磁盘(U 盘/移动硬盘等)时,正常情况下,只能读取,不能写入。我们可以借助一些第三方软件,实现 NTFS 的读写操作,但是其实 macOS 已经内置了对 NTFS 的读写支持,只是由于种种原因,Apple 屏蔽了对 NTFS 的“写入”操作。

阅读更多 >>

经纬度在 WGS-84/GCJ-02/BD09 坐标系之间的转换

国内各大地图厂商SDK都会内置了一些转换函数以供使用,但是有时候我们的小项目并不需要引入这些庞大的SDK,也没去申请相关授权key(毕竟现在商用都是收费了,费用还不低呢)。

下面整理了一些经纬度在不同的地理坐标系之间相互转换的方法,提供 Objective-C 和 TypeScript 版本。

阅读更多 >>

Element-Plus 中图标的使用

element-plus 提供了一套常用的SVG图标集,可以根据项目实际情况进行使用。

安装图标库

npm install @element-plus/icons-vue

阅读更多 >>

为 ElementUI 中的 Message 设置全局的偏移量

部分系统会在顶部有导航栏,element-ui 中 Message 消息提示的默认偏移量是 20px,会遮挡顶部内容,所以需要将偏移量进行全局调整。

环境

    阅读更多 >>

    真机调试在线安装 ipa 包

    当我们需要真机调试时,最简单快捷的方式还是用 USB 线连接 iPhone/iPad 等设备,然后通过 Xcode 直接编译安装,如果只是一个人在开发时调试倒也没什么问题,但是如果到了测试阶段,需要分发给 N 个测试人员,这个时候还是通过 Xcode 一台一台地安装 App 就显得过于繁琐了,这种情况下我们就可以考虑在线安装的方式了,直接打开安装页面,点击一下则自动安装 App。

    阅读更多 >>

    JavaScript 判断时段是否有交集

    在做排班功能时,有个需求就是对同一个人员在同一天时间内,所排班次的时间不允许存在有交集。

    假设有三个班次:A(08:00-11:30)、B(09:00-12:00)、C(13:30-18:00),对于员工张三来说,如果在同一天内排了A班次则不允许排B班次,因为这两个班次在时间上存在交集(09:00-11:30),一个人不可能同时上多个班次。

    阅读更多 >>

    JavaScript 条件判断之 boolean 类型值的骚操作(!!)

    前言

    条件判断是我们在写代码时最常用的语法之一,如:

    let n = 0
    if (n) {}
    
    let s = ''

    阅读更多 >>

    探索 el-table 中 tooltip 功能实现

    el-table 中有个当内容超出一行时,会显示尾部省略号并且鼠标放上去会有 tooltip 提示效果的功能,现在我们就来探索一番,看下 el-table 是如何实现该功能的,最后我们再自己尝试仿照实现一个以加深理解。

    阅读更多 >>

    React Navigation 6.x 的使用

    作为 react native 小菜鸡一枚,第一次接触 react navigation 路由框架,对其也是很懵逼,在不断探索学习中;由于平时都是用 Vue 进行开发,所以对 vue-router 比较熟悉一些,故而想着用 vue-router 路由表那一套用法来使用 react navigation,当然这个用法不是必须和唯一的,你可以根据你的习惯来开发即可。

    阅读更多 >>

    TypeScript 扩展基础类型

    有时候为了方便,我们会对 JavaScript 内置的基础数据类型进行扩展,添加一些自定义方法。这里介绍下在 TypeScript 中如何进行扩展,添加代码提示。

    目录结构

    src

    阅读更多 >>

    TypeScript 中 type 和 interface 的异同

    interfacetype 都是可以用来定义数据类型的,大部分场景下,能用 interface 定义的自然也可以用 type 定义,他们两者功能类似,却又有些许区别。

    阅读更多 >>

    微前端框架--qiankun初探

    什么是微前端

    Techniques, strategies and recipes for building a modern web app with multiple teams that can ship features independently. –Micro Frontends
    微前端是一种多个团队通过独立发布功能的方式来共同构建现代化 web 应用的技术手段及方法策略。

    阅读更多 >>

    Web自动锁屏功能

    Web项目中有一个自动锁屏的功能,当用户停止操作页面超过一定时间后,自动锁屏。

    场景分析

    首先我们确定下用户的操作有哪些:

    • 鼠标点击

    阅读更多 >>

    Unable to load script. Make sure you're either running a Metro (run 'npx react-native start') or that your bundle "index.android.bundle' is packaged correctly for release.

    当通过 yarn run android 将 React Native 项目跑在 Android 模拟器上时,模拟器上报了如下错误信息:

    Unable to load script. Make sure you're either running a Metro (run 'npx react-native start') or that your bundle "index.android.bundle' is packaged correctly for release.

    阅读更多 >>

    react-native-vector-icons 的使用

    React Native 项目中会经常用到 react-native-vector-icons 来显示小图标,这里介绍如何在 iOS/Android 上使用该库。

    阅读更多 >>

    关于 react-native-snap-carousel 报 ViewPropTypes 的错误

    环境

    先说一下我当前的环境

    • react 18.0.0
    • react-native 0.69.1
    • react-native-snap-carousel 3.9.1

    阅读更多 >>

    TypeScript中的高级类型

    对于熟悉 JavaScript 的开发者来说,要切换到 TypeScript 是很容易的,只需掌握 TypeScript 中的基础数据类型,然后在写代码时加上对应的类型即可。但是如果稍不注意就会导致很多地方都是用 any,最终把项目写成了 AnyScript,失去了 TypeScript 的意义。所以我们在掌握了基础类型后,更应该掌握一些高级类型,写出更加健壮的代码。

    阅读更多 >>

    Vue对接湖南省“互联网+政务服务”一体化平台统一身份认证

    前因

    领导给安排了一个任务,给湖南省XX市做一个电子证照的申报模块。

    其实这功能分两部分,一部分是嵌入“我的XX” App 中进行使用的,App 提供了相关的 JS SDK,可以获取登录的账号数据,所以账号数据由 App 进行提供,这部分没什么好说的,三下五除二就给他搞完了。

    阅读更多 >>

    macOS 通过 brew 安装 Tomcat

    这里是通过 Homebrew 来安装 Tomcat,不涉及通过其他途径的安装。

    安装

      阅读更多 >>

      mockjs 的入门使用

      在做 web 项目时,常常会通过一些手段来模拟后台返回的数据,今天主要是介绍下 mockjs 的使用。

      安装

      npm i mockjs -D

      阅读更多 >>

      在Vue3+Vite项目中使用SVG图标

      在 Vue + Webpack 的项目中,可以通过 svg-sprite-loader 插件来使用 SVG 图标,但是在 Vite 项目下则行不通。

      vite-svg-loader

      通过 vite-svg-loader 插件可以将SVG图标作为组件使用。

      阅读更多 >>

      身份证号码那点事

      身份证号码的组成格式

      直接附上人民日报关于身份证号码格式的说明图片(一图胜过千言万语有木有):

      idcard.png

      阅读更多 >>

      el-table 在刷新页面后高度显示异常的问题

      最近在维护一个老项目的时候,发现这么一个有趣的问题,页面中使用了 el-table 这个组件来展示数据并且通过 height 属性设置了固定高度,如果是正常的点击跳转,表格高度也能正确地显示,但是只要你一刷新页面后,表格高度就会出现异常了,只能显示一条数据的高度。

      阅读更多 >>

      macOS 检测端口是否连通

      我们想要知道某个IP是否能访问,可以通过 ping 命令检测:

      ping -c 5 192.168.1.1
      

      但是我们想进一步检测某个IP对应的电脑是否打开了某个端口,这时就不能用 ping 命令了,而是用 nc 命令:

      阅读更多 >>

      element-plus Loading 和 Message 组件在自动导入的情况下不显示

      最近在学习 Vue3 + ElementPlus,并且按照 ElementPlus 官方文档上的使用指南,采用了 自动导入 的用法,在其他组件比如 el-buttonel-icon 等组件均能正常工作,但是 Loading、Message 等这种以服务的方式来调用的组件却不能正常显示出来。

      阅读更多 >>

      在 Vue3 中挂载全局属性

      定义全局属性

      在 Vue2 中, Vue.prototype 通常用于添加所有组件都能访问的 property。

      Vue.prototype.$http = axios

      阅读更多 >>

      Vite 配置别名 @

      配置别名@

      我们在项目中 import 文件时都喜欢用 @ 这个别名来表示 src 这个目录,在 Vite 项目中,如何配置这个别名呢?

      阅读更多 >>

      Vue 全局引入 sass 文件

      前言

      现在的项目一般都会集成 CSS预处理器,不管用的是 SassLESSStylusPostCSS 中的哪一种,都能提高我们 CSS 的编写效率,也能使我们编写的 CSS 看起来更像是一个程序。

      阅读更多 >>

      iPhone 链接 macOS 不断闪烁

      当 iPhone 通过数据线连接 macOS 时,iPhone 的充电状态一直在闪烁,频繁的在 断开/已连接 之间不停地切换。

      如果重启电脑/手机、更换数据线都不能解决时,可以尝试把 usbd 服务停掉:

      sudo killall -STOP -c usbd

      阅读更多 >>

      iOS新项目企业签名打包报错

      工作了这么多年,还是今年第一次接触到苹果的企业账号打包 App,由于 app 不上架,都是通过企业签名方式打包,让客户通过扫码方式下载安装。

      错误提示

      由于是新项目并且是 Automatically manage signing 自动签名,当执行 Archive 打包时,给出了如下错误信息:

      阅读更多 >>

      Xcode13 在左侧项目目录结构树中没有 Products 文件夹

      以前老版本 Xcode,编译项目后会在左侧项目目录中有个 Products 的文件夹,里面包含了我们编译生成的 app 文件,但是更新到 Xcode13 之后,新建的项目你会发现在左侧目录中没有了这个 Products 文件夹,但是我们可以通过菜单快速定位到这个目录。

      阅读更多 >>

      极光推送在iOS正式环境收不到通知

      iOS app 中使用了极光推送,并且在 debug 模式下也能正常接收到通知消息,但是一旦切换到 release 正式环境下,则无法收到通知消息。

      主要原因是因为 JAVA 后台通过 SDK 调用极光接口时,apns_production 参数的值不匹配导致的,在后台代码中将该值设置为 true 即可。

      阅读更多 >>

      Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

      之前在 GitHub 上进行 clone、push 等操作,都是通过 SSH keys 私钥的方式来进行操作,这过程中不需要用到 GitHub 的账号和密码,今天换了台电脑,在执行 push 操作时并在输入账号和密码后却报错了:

      remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.

      阅读更多 >>

      Unable to prepare iPhone for development

      Xcode 真机调试时突然提示:

      Please check the connection to the device, and review all errors in the Devices and Simulators window.
      

      阅读更多 >>

      WKWebView 与 JavaScript 进行通讯

      2020年4月起App Store将不再接受使用UIWebView的新App上架、2020年12月起将不再接受使用UIWebView的App更新。苹果已经彻底抛弃了UIWebView,所以我们不再讨论关于UIWebView的问题。

      苹果从 iOS8.0 为我们带来了全新的 WKWebView,WKWebView 为我们和 JavaScript 的交互带来了不一样的体验。

      阅读更多 >>

      Vue 导出 Excel

      最近做了一个和 Android 设备机进行交互的 Web 项目,基本原理是在 Android 上通过 AndServer 搭建一个 HTTP 服务器,然后把 Vue 项目打包进去,这样就可以通过网页和 Android 设备进行交互,配置一些常用选项、查看数据、导出数据。

      阅读更多 >>

      TypeError: this.getOptions is not a function

      昨天在把 uni-app 小程序项目从 HBuilderX 开发方式迁移到 VSCode 中来,当把项目依赖都安装好,执行 npm run dev:mp-weixin 开始编译到微信小程序平台时,终端报了以下错误信息:

       ERROR  Failed to compile with 1 

      阅读更多 >>

      Flex 设置横向滚动后元素宽度被压缩

      当给一个容器采用 flex 布局并且设置横向滚动的时候,当所有子元素的内容超出父元素的宽度时,子元素的宽度被压缩了,从而导致变形。

      需要给父元素设置 overflow-x: auto; 属性,然后子元素设置 flex-shrink: 0; 属性。

      阅读更多 >>

      [self class] & [super class]

      思考

      请问以下代码的运行结果是什么?

      @interface MYObject : NSObject
      @end
      
      @implementation MYObject

      阅读更多 >>

      Compiling IB documents for earlier than iOS 7 is no longer supported

      最近在苹果官方网站下载了一个 Demo,由于年代久远,Xcode 打开编译后,直接提示如下错误信息:

      Compiling IB documents for earlier than iOS 7 is no longer supported.
      

      阅读更多 >>

      解决集成百度OCR后,模拟器不能运行的问题

      模拟器报错

      由于项目需要识别银行卡信息和身份证信息,最终决定采用百度家的 OCR SDK,一共有三个库:

      阅读更多 >>

      免费 SSL 证书

      高能预警,本篇内容图片较多,无流量者请速速离开!!!

      阿里云提供了免费的 SSL 证书,我也一直有在用,只是到期后老是忘记去处理,就会导致浏览器在访问站点时进行安全提示,虽然可以通过点击 继续前往 链接打开站点,但这个提示总会让人心里发毛,到底安不安全(虽然我知道我的站点 100% 安全,但是别人不知道啊哈哈哈哈哈哈)。

      阅读更多 >>

      GCD面试题分享

      GCD 老生常谈的话题,下面分享几道面试题。

      某团面试题

      @property (nonatomic, assign) int num;

      阅读更多 >>

      Key-Value Observing(KVO)

      关于 KVO

      键值观察是一种机制,它允许对象在其他对象的指定属性发生更改时收到通知。

      Key-value observing is a mechanism that allows objects to be notified of changes to specified properties of other objects.

      阅读更多 >>

      Key-Value Coding(KVC)

      关于 KVC

      键值编码是由 NSKeyValueCoding 非正式协议启用的一种机制,对象采用该机制提供对其属性的间接访问。当对象符合键值编码要求时,其属性可以通过字符串参数通过简洁、统一的消息接口寻址。这种间接访问机制补充了实例变量及其相关访问器方法提供的直接访问。

      阅读更多 >>

      objc_class 中对 cache 属性的初探

      今天我们来探索下类的 cache 属性,cache 顾名思义就是 缓存,那么它到底缓存的是什么数据呢?

      cache 存的是什么?

      源码在手,天下我有!

      阅读更多 >>

      isKindOfClass & isMemberOfClass 的分析

      测试代码

      @interface MYObject : NSObject
      
      @end
      
      @implementation MYObject

      阅读更多 >>

      OC对象的原理(上) -- alloc的本质

      前因

      新建一个 iOS App 项目工程,然后先来看段代码

      MYObject *obj1 = [MYObject alloc];

      阅读更多 >>

      objc4-818.2 源码编译调试

      在平常的开发中,我们都只是知道有 objc 这个框架,为我们提供了一些底层接口(例如 runtime 以及 objc_msgSend 等);如果我们能够将 objc 源码跑起来,加上 LLDB 进行调试,就能够清晰的分析整个代码的执行流程。

      当前环境

        阅读更多 >>

        ping IP和端口

        macOS

        • IP
        ping 127.0.0.1
        

        阅读更多 >>

        修复 iOS 网页在拍照预览时图片被旋转的问题

        前几天用 uni-app 写了个上传图片的小案例(编译到 H5 端),当在 iPhone 上拍照上传时,发现在页面上预览的图片是发生了旋转的。

        图片的 Exif 信息

        Exif 全称 Exchangeable image file format,中文叫可交换图像文件格式,Exif 中存储了图片的方向信息。

        阅读更多 >>

        CSS设置宽高比

        <view class="scale-box">
            <view class="scale-box-content">
                <!-- content -->
            </view>

        阅读更多 >>

        iOS 验证码输入框

        特性

        • 支持自定义验证码长度(默认长度为6)
        • 支持切换键盘类型,适应纯数字、数字+字母等组合(默认为系统数字键盘)
        • 验证码输入完毕后自动收起键盘并通过block回调调用者

        阅读更多 >>

        通过 DOMSubtreeModified 事件接收 DOM 节点变化的回调

        需求场景:通过 WKWebView 加载第三方网页,其中有一个录制人脸视频的功能,为了用户体验需要默认调用前摄像头,然而第三方的网页我们无法调整,只能通过注入 JS 来修改 input 标签,将 capture 属性改成 user 即可调用前摄像头。

        网页内容是动态生成的,并不是写死的模板,所以需要监听 body 子节点发生改变的事件,每当 body 内容发生变更时,就去找出调用摄像头的 input 标签,找到之后动态修改它的属性。

        阅读更多 >>

        适配iOS13

        虽然苹果在今天推送了 iOS13.1.1 ,但还是简单记录下适配 iOS13 的过程吧。

        KVC禁止访问私有属性

        在 Xcode11 中苹果禁止了开发者通过 KVC 方式获取私有属性,如果你在代码中通过该方式访问了不该访问的东西,App 则会闪退并在控制台中可以看到如下错误信息:

        阅读更多 >>

        macOS中搭建PHP+MySQL环境

        请先安装 HomeBrew 工具

        安装PHP

        macOS自带了PHP,不过自带的PHP版本都是比较老的,我们可以通过brew工具来安装PHP并且不会与系统自带的PHP产生冲突。

        阅读更多 >>

        iOS 逆向之 Cycript 篇

        Cycript 是由 saurik 推出的一款脚本语言,可以看作是 Objective-C 和 JavaScript 的结合物,可通过 Cydia 安装。

        注入进程

        一般都是使用 cycript 来进行一些代码的测试,所以需要先把 cycript 注入到目标应用的进程中,通过如下方式注入:

        阅读更多 >>

        Homebrew

        Homebrew 是 mac 平台的软件包管理器,它允许我们通过 brew install xxx 的方式安装软件。

        安装 Homebrew

        官网 上有详细的说明,可以自行查阅。

        阅读更多 >>

        iOS 砸壳教程

        iOS 从 App Store 下载的应用都是加过壳的(只有从 App Store 下载的才是加壳的,系统应用和其他渠道下载的都是未加壳的),要想对应用进行逆向,首先得把这层壳去掉,俗称脱壳砸壳

        工具

          阅读更多 >>

          Sublime Text 报 There are no packages available for installation 错误

          前言

          最近升级了 Sublime Text 后突然安装不了插件了,卸载了重新安装还是照样报错。错误信息如下图所示:

          error.png

          阅读更多 >>

          Method Swizzling

          交换方法实现

          得益于 Objective-C 的 runtime 机制,method swizzling 这个黑魔法可以为我们在实际开发中解决诸多常规手段所不能解决的问题。

          阅读更多 >>

          基于阿里云 OSS 搭建 hexo 博客

          时间过的真快,转眼弹性Web托管服务也即将到期了,但是每年 RMB199 的费用确实有点高了,所以今年不打算续费了,转战 OSS。

          OSS 的计费方式分为 按量付费包年包月 两种方式,由于本站访问量实在是低,流量费用简直可以说是忽略不计,所以我采用了按量付费的计价方式。

          阅读更多 >>

          macOS/Linux 文本替换

          有时候我们需要将项目下的某个字符串全局替换成另一个字符串,可以借助 IDE 工具,当然也可以直接通过 grep + sed 命令完成。

          单文件文本内容替换

          sed -i "" "s/search/replace/g" filename

          阅读更多 >>

          Android 反编译

          可以从各大应用商店下载 apk 安装包

          获取 classes.dex 文件

          将 apk 后缀改成 .zip,然后解压出来的文件就会包含 classes.dex

          阅读更多 >>

          setTimeout 的时间限制

          函数定义:

          setTimeout(function, millisec);
          

          对于 setTimeout 函数的说明,不管是 w3cschool 还是 MDN 文档都未提及第二个参数 millisec 的取值范围,只是简单地说明该参数是一个需要延时执行的毫秒数。

          阅读更多 >>

          重载jQuery的ajax方法解决JSON解析的问题

          当服务器返回的JSON字符串中包含回车符等特殊字符时,ajax的解析会报错,导致程序执行异常。

          为了解决这个问题,在不侵入任何代码的情况下,只能替换 jQuery ajax 的方法实现了。

          将下面的代码复制到公共js的顶部,确保在发送网络请求之前就已经执行了替换操作,这样我们就能自定义解析服务器返回的JSON数据了。

          阅读更多 >>

          macOS's dark mode (暗黑模式)

          苹果在 macOS 10.14 中为我们带来了 dark mode (暗黑模式) 功能

          可以在 系统偏好设置通用 面板中开启暗黑模式

          判断当前主题是否为暗黑模式

          - (BOOL)isDarkMode {

          阅读更多 >>

          Charles进行HTTPS抓包

          当前环境:macOS 10.14.1 + Charles 4.2.7 + iPhone 7 iOS 12.1

          下载安装Charles

          前往 https://www.charlesproxy.com/download/ 下载对应平台的 Charles 软件。

          阅读更多 >>

          SDWebImage 4.x 播放GIF图片

          今天产品部的突然说 iOS 版 App 播放不了 GIF,一接到这个反馈信息,我一开始是不相信的,因为之前的旧版也是用的 SDWebImage 这个库且未做任何代码适配就能够播放 GIF,所以我内心是极不愿相信这是我的锅。

          新版 App 重构后也上线了两个多月了,这期间由于 App 未涉及到 GIF 的播放,所以一直未发现该问题(是我工作的疏忽)。

          阅读更多 >>

          微信小程序转发按钮的显示与隐藏

          在小程序就要上线之际,突然接到一个需求:只有登录的用户才能转发小程序。

          在一接到这个需求的时候,我内心是很拒绝的,一时间也是一脸懵逼态,无从下手。在我痛定思痛之后,发现了一对 API wx.showShareMenuwx.hideShareMenu,这对 API 能够显示/隐藏 当前 页面的转发按钮。

          阅读更多 >>

          为微信小程序增加通知机制

          当有多个页面需要监听某个状态(如:登录状态),当状态发生改变时,需要及时通知到每个监听者(页面),这就是通知机制。

          源码

          新建一个 NotificationCenter.js 文件,内容如下:

          阅读更多 >>

          微信小程序扩展 Page 对象

          对于 iOS 开发者来说,如果需要对一个类进行扩展,第一反应就是 runtime + category,有了这组合,我们简直可以为所欲为,为类添加属性、方法、重写某个方法都不在话下。

          阅读更多 >>

          UITabBar 点击刷新功能

          我们都知道 UITabBar 只能添加 UITabBarItem,而 UITabBarItem 是继承自 NSObject 的,但是我们可以发现 UITabBarItem 内部有一个 _view 属性与私有类 UITabBarButton 关联着,而这个 UITabBarButton 正是我们在 UITabBar 上看到的一个个按钮对象。

          阅读更多 >>

          修复 iOS12.1 UITabBar 布局错乱的bug

          此 Bug 是在 iOS 12.1 Beta2 版本中被引入的,没想到在 iOS 12.1 正式版中并未修复

          Bug触发条件

            阅读更多 >>

            iOS禁用第三方输入法

            当我们需要用户输入数字时,我们会将键盘类型设置为 UIKeyboardTypeNumberPadUIKeyboardTypePhonePadUIKeyboardTypeDecimalPad 等数字类型的键盘。但是如果用户使用了第三方输入法(比如搜狗),那就无法达到强制输入数字的目的了,因为搜狗输入法在这些 UIKeyboardType 枚举类型中,除了常规的 0~9 数字键外,还额外带了其他符号键,用户可以输入一些特殊字符,此时如果想要达到效果,就只能通过重写遵守 UITextFieldDelegate 并实现 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 方法,在这里通过正则判断用户输入的是否为数字。

            阅读更多 >>

            iOS 刘海屏适配

            今年苹果发布了三款 iPhone,分别为 iPhone XS、iPhone XS Max 以及 iPhone XR,尽管大家都在吐槽刘海屏,但是苹果今年已经是 iPhone 系列标配刘海屏了。

            虽然苹果为我们带来了更大屏幕尺寸的 iPhone XS Max 和 iPhone XR,尽管一个是6.5英寸一个是6.1英寸,并且 iPhone XS Max 的分辨率更是达到了 1242px × 2688px,但是对于我们开发者来说,这两者的物理尺寸都一个样,都是 414×896pt,而 6/7/8 Plus 系列的宽度也是 414pt,所以你可以把他们看作是 plus 系列的加长版。

            阅读更多 >>

            UIButton 被禁用时显示一个菊花提示用户正在加载中

            当点击按钮后,可能会执行一个比较耗时的操作,但是又不方便在整个页面进行提示时,此时如果我们仅仅只是把按钮禁用了以防用户重复点击,但是用户并不知道操作是否还在继续,用户体验不够友好;但是如果我们在按钮被禁用时,自动显示一个转圈圈的小菊花进行提示,那用户体验就会好很多,用户一看就知道当前操作正在进行中。

            阅读更多 >>

            解决 UIButton 快速点击后重复提交数据

            有时候我们快速点击按钮多次,会触发多次点击事件,最终导致数据提交多次,这是很没必要的。

            说明

            • 默认开启防重复点击功能,默认间隔时间 0.5

            阅读更多 >>

            UITableViewHeaderFooterView 修改背景色/文字

            注意点:

            • 修改背景色只能通过修改 contentViewbackgroundView 的背景色实现,修改 UITableViewHeaderFooterView 自身背景色无效果
            • 只能在 tableView:willDisplayHeaderView:forSection: 代理方法中进行设置,在 tableView:didEndDisplayingHeaderView:forSection: 设置无效

            阅读更多 >>

            iOS JSON解析换行符(\r、\n、\r\n)

            项目需要对JSON返回的换行符进行解析,系统提供了解析JSON的方法[NSJSONSerialization JSONObjectWithData:options:error:]
            AFNetworking 内部也是采用该方法来解析服务器返回的内容。所以,我只需要 hook 该系统方法,当解析失败的时候进行处理就行了,这样就可以一劳永逸,也无需修改其他地方的代码。

            阅读更多 >>

            为 NSArray/NSDictionary 优雅地过滤 nil 值

            作为一名 iOS 开发者,肯定知道 NSArray/NSDictionary 不能存储 nil 值,如果你试图往数组/字典中存储 nil,那么 App 也将毫不客气的为你闪退。

            尽管在日常的编码中,我们都会小心翼翼的处理 nil,但是总会有纰漏,毕竟大部分数据都是从服务器下发的,我们很难彻底把控。作为一名码农,肯定是想着怎么偷懒的,既能自动规避 nil,又能够不影响现有代码,最好不用引入第三方方法。得益于 Objective-C 的 runtime 机制,我们可以很优雅地通过 Method Swizlling 来解决上述问题。

            阅读更多 >>

            iOS Haptics Feedback (触感反馈)

            要求

            • iOS 10.0+
            • iPhone 7/7P 或更新机型
            • 打开”设置–声音与触感–系统触感反馈”选项

            阅读更多 >>

            WKWebView在iOS9上崩溃

            最近项目重构,所以采用了 WKWebView 来展示网页内容,但是发现在 iOS9 上程序会出现 crash,以前也用过 WKWebView 但是都没遇到这么坑的情况啊。

            具体操作:通过 push 网页控制器,然后在 pop 之后,程序就崩了。

            打断点也定位不到 crash 代码行,打开 Xcode 的僵尸模式之后,控制台也仅输出以下信息:

            阅读更多 >>

            iOS地铁图

            使用了高德地图的JS API,文档戳这里

            原理

            通过 WKWebView 加载一个 HTML 字符串,通过注入 JS 在页面加载完毕后加载高德地图的JS库,然后创建地铁地图,同时通过JS库提供的 getCityList 接口获取所有的城市信息,然后把城市数据回传给 Objective-C,OC 在拿到数据后在右上角添加一个切换城市的按钮,当选择所要切换的城市后,通过 WKWebView 调用 JS 代码并把城市 id 传递给 JS,JS 拿到数据后通过 setAdcode 接口来切换地铁数据。

            阅读更多 >>

            十六进制字符串转UIColor

            支持十六进制字符串的格式有:

            • #FFF
            • #FFFF
            • #FFFFFF

            阅读更多 >>

            修改DZNEmptyDataSet按钮的宽高

            相信没有哪款App是没有使用到滚动视图(UIScrollView、UITableView、UICollectionView)的吧,我相信大家用的最多的就是UITableView了,当需要展示列表数据时,我想大家第一次时间想到的就是UITableView。

            如果数据不为空的时候还好,可谁也不能保证一定会有数据展示吧,如果没数据的时候,就会给客户呈现一个空白页面(白板),此时我们可以给用户一点提示信息(图片、文字),这不仅可以提升用户体验,也不至于让用户一脸懵逼。

            阅读更多 >>

            使用 unwind segues 关闭当前页面

            我们经常会遇到这样一种需求,在控制器上有一个关闭按钮,点击来关闭当前页面。而我们通常的做法都是在 Storyboard 上拖一个 UIButton 出来,然后将 UIButton 拖线到控制器上,新建一个 IBAction 方法,并在该方法中通过代码来关闭当前控制器。

            其实,我们可以不需要这么麻烦,可以通过 Unwind Segue 在 Storyboard 上拖拖线即可达到关闭控制器的效果。

            阅读更多 >>

            在Markdown中创建表格

            越来越多人采用Markdown进行写作,而表格作为一种比较常见的需求,Markdown也支持快速创建表格。

            语法:

            | Name | Score |
            | :- | :-: |
            | zhangsan | 90 |

            阅读更多 >>