iOS开发--微信首页下拉拍摄的眼睛效果(直接拿走)

针对 iOS端禁止列表顶部下拉和底部上拉露出浏览器灰色背景 的解决方案。 立即下载

话不多说直接上图
这里写图片描述
是不是很爽?
直接上代码:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic, strong) UITableView *tableView;

@property (strong, nonatomic) CAShapeLayer *eyeFirstLightLayer;
@property (strong, nonatomic) CAShapeLayer *eyeSecondLightLayer;
@property (strong, nonatomic) CAShapeLayer *eyeballLayer;
@property (strong, nonatomic) CAShapeLayer *topEyesocketLayer;
@property (strong, nonatomic) CAShapeLayer *bottomEyesocketLayer;

@end
- (void)viewDidLoad {
    [super viewDidLoad];
    UIView *bg = [[UIView alloc] initWithFrame:CGRectMake(0, 64, width, height)];
    bg.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.5];
    [self.view addSubview:bg];
    [bg addSubview:self.headView];

    self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 64, width, height+64)];
    self.tableView.delegate = self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
    self.tableView.backgroundColor = [UIColor clearColor];


    [self.headView.layer addSublayer:self.eyeFirstLightLayer];
    [self.headView.layer addSublayer:self.eyeSecondLightLayer];
    [self.headView.layer addSublayer:self.eyeballLayer];
    [self.headView.layer addSublayer:self.topEyesocketLayer];
    [self.headView.layer addSublayer:self.bottomEyesocketLayer];

    [self setupAnimation];
}
- (UIView *)headView
{
    if (!_headView) {
        CGFloat headViewH = 40.0;
        CGFloat headViewW = 60.0;
        _headView = [[UIView alloc] initWithFrame:CGRectMake((width-headViewW)/2.0, 10, headViewW, headViewH)];
//        _headView.backgroundColor = [UIColor blackColor];
    }
    return _headView;
}

- (CAShapeLayer *)eyeFirstLightLayer {
    if (!_eyeFirstLightLayer) {
        _eyeFirstLightLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.headView.frame) / 2, CGRectGetHeight(self.headView.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
                                                            radius:CGRectGetWidth(self.headView.frame) * 0.2
                                                        startAngle:(230.f / 180.f) * M_PI
                                                          endAngle:(265.f / 180.f) * M_PI
                                                         clockwise:YES];
        _eyeFirstLightLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeFirstLightLayer.lineWidth = 5.f;
        _eyeFirstLightLayer.path = path.CGPath;
        _eyeFirstLightLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeFirstLightLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _eyeFirstLightLayer;
}
- (CAShapeLayer *)eyeSecondLightLayer {
    if (!_eyeSecondLightLayer) {
        _eyeSecondLightLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.headView.frame) / 2, CGRectGetHeight(self.headView.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
                                                            radius:CGRectGetWidth(self.headView.frame) * 0.2
                                                        startAngle:(211.f / 180.f) * M_PI
                                                          endAngle:(220.f / 180.f) * M_PI
                                                         clockwise:YES];
        _eyeSecondLightLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeSecondLightLayer.lineWidth = 5.f;
        _eyeSecondLightLayer.path = path.CGPath;
        _eyeSecondLightLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeSecondLightLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _eyeSecondLightLayer;
}
- (CAShapeLayer *)eyeballLayer {
    if (!_eyeballLayer) {
        _eyeballLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.headView.frame) / 2, CGRectGetHeight(self.headView.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center
                                                            radius:CGRectGetWidth(self.headView.frame) * 0.3
                                                        startAngle:(0.f / 180.f) * M_PI
                                                          endAngle:(360.f / 180.f) * M_PI
                                                         clockwise:YES];
        _eyeballLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeballLayer.lineWidth = 1.f;
        _eyeballLayer.path = path.CGPath;
        _eyeballLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeballLayer.strokeColor = [UIColor whiteColor].CGColor;
        _eyeballLayer.anchorPoint = CGPointMake(0.5, 0.5);
    }
    return _eyeballLayer;
}
- (CAShapeLayer *)topEyesocketLayer {
    if (!_topEyesocketLayer) {
        _topEyesocketLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.headView.frame) / 2, CGRectGetHeight(self.headView.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, CGRectGetHeight(self.headView.frame) / 2)];
        [path addQuadCurveToPoint:CGPointMake(CGRectGetWidth(self.headView.frame), CGRectGetHeight(self.headView.frame) / 2)
                     controlPoint:CGPointMake(CGRectGetWidth(self.headView.frame) / 2, center.y - center.y - 20)];
        _topEyesocketLayer.borderColor = [UIColor blackColor].CGColor;
        _topEyesocketLayer.lineWidth = 1.f;
        _topEyesocketLayer.path = path.CGPath;
        _topEyesocketLayer.fillColor = [UIColor clearColor].CGColor;
        _topEyesocketLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _topEyesocketLayer;
}

- (CAShapeLayer *)bottomEyesocketLayer {
    if (!_bottomEyesocketLayer) {
        _bottomEyesocketLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.headView.frame) / 2, CGRectGetHeight(self.headView.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, CGRectGetHeight(self.headView.frame) / 2)];
        [path addQuadCurveToPoint:CGPointMake(CGRectGetWidth(self.headView.frame), CGRectGetHeight(self.headView.frame) / 2)
                     controlPoint:CGPointMake(CGRectGetWidth(self.headView.frame) / 2, center.y + center.y + 20)];
        _bottomEyesocketLayer.borderColor = [UIColor blackColor].CGColor;
        _bottomEyesocketLayer.lineWidth = 1.f;
        _bottomEyesocketLayer.path = path.CGPath;
        _bottomEyesocketLayer.fillColor = [UIColor clearColor].CGColor;
        _bottomEyesocketLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _bottomEyesocketLayer;
}

- (void)setupAnimation {
    self.eyeFirstLightLayer.lineWidth = 0.f;
    self.eyeSecondLightLayer.lineWidth = 0.f;
    self.eyeballLayer.opacity = 0.f;
    _bottomEyesocketLayer.strokeStart = 0.5f;
    _bottomEyesocketLayer.strokeEnd = 0.5f;
    _topEyesocketLayer.strokeStart = 0.5f;
    _topEyesocketLayer.strokeEnd = 0.5f;
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    [self animationWith:scrollView.contentOffset.y];
}

- (void)animationWith:(CGFloat)y {
    CGFloat flag = self.view.frame.origin.y * 2.f - 20.f;
    if (y < flag) {
        if (self.eyeFirstLightLayer.lineWidth < 5.f) {
            self.eyeFirstLightLayer.lineWidth += 1.f;
            self.eyeSecondLightLayer.lineWidth += 1.f;
        }
    }
    if(y < flag - 20) {
        if (self.eyeballLayer.opacity <= 1.0f) {
            self.eyeballLayer.opacity += 0.1f;
        }
    }
    if (y < flag - 40) {
        if (self.topEyesocketLayer.strokeEnd < 1.f && self.topEyesocketLayer.strokeStart > 0.f) {
            self.topEyesocketLayer.strokeEnd += 0.1f;
            self.topEyesocketLayer.strokeStart -= 0.1f;
            self.bottomEyesocketLayer.strokeEnd += 0.1f;
            self.bottomEyesocketLayer.strokeStart -= 0.1f;
        }
    }
    if (y > flag - 40) {
        if (self.topEyesocketLayer.strokeEnd > 0.5f && self.topEyesocketLayer.strokeStart < 0.5f) {
            self.topEyesocketLayer.strokeEnd -= 0.1f;
            self.topEyesocketLayer.strokeStart += 0.1f;
            self.bottomEyesocketLayer.strokeEnd -= 0.1f;
            self.bottomEyesocketLayer.strokeStart += 0.1f;
        }
    }
    if (y > flag - 20) {
        if (self.eyeballLayer.opacity >= 0.0f) {
            self.eyeballLayer.opacity -= 0.1f;
        }
    }
    if (y > flag) {
        if (self.eyeFirstLightLayer.lineWidth > 0.f) {
            self.eyeFirstLightLayer.lineWidth -= 1.f;
            self.eyeSecondLightLayer.lineWidth -= 1.f;
        }
    }
}
ios-微信首页下拉眼睛动画.zip 微信首页下拉眼睛动画 立即下载

相关推荐

Android-PullDownListView-一个下拉刷新的控件实现了仿微信下拉中眼睛动画的效果

PullDownListView - 一个下拉刷新的控件,实现了仿微信下拉中眼睛动画的效果

iOS 玩转微信——下拉小程序

⭐️ 概述 本文笔者将手把手带领大家像素级还原微信下拉小程序的实现过程。尽量通过简单易懂的言语,以及配合关键代码,详细讲述该功能实现过程中所运用到的技术和实现细节,以及遇到问题后如何解决的心得体会。希望正有此功能需要的小伙伴们,能够通过阅读本文后,能快速将此功能真正运用到实际项目开发中去。 当然,笔者的实现方案不一定是微信官方的实现,毕竟一千个观众眼中有一千个潘金莲,但是,不管黑猫白猫,能捉老鼠的就是好猫,若能够实现此功能,相信也是一个不错的方案。希望该篇文章能为大家提供一点思路,少走一些弯路,填补

u011581932的博客 2084

模仿iOS版微信的滑动View效果

前言 最近经常交替使用Android和iOS手机。对于两个系统,从我们常用的列表来看,Android一般的列表菜单是通过长按出来的,而iOS是通过滑动出现的。比如我们常用的微信,对于Android版本,长按某个聊天好友,会弹出 标为未读,置顶聊天,删除聊天 选项;对于iOS的版本,右滑,会显示出 标为未读,删除 选项 ———————————我是分割线——————————— 1. 滑动View 1.1 内容展示 我在Android上面,实现了一个滑动的View,模仿的是微信的iOS版,先简单列举一下功能,直接上图,看着比较直观一些。下面我放了四个动画,分别是:滑动展开,单击,长按,双击。 滑动

iOS 仿微信首页下拉弹出小程序

下载demo链接地址:https://github.com/825197989/iOS-.git

ANDY_GUO_wei的专栏 3072

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

(Cascade extended state observer)级联ADRC的simulink仿真和程序---送给中国研究学者的精华版

weixin_44312889的博客 3778

5张图,搞懂三方支付机构的“备付金账户”体系

本文将详细解析第三方支付机构各类备付金账户的功能定位、所承载的支付业务处理流程以及日常管理。

银行信息系统应用架构详解 2144

仿照微信首页下拉拍照的demo

项目源码地址

干克小子 2054

智能车竞赛模糊PID代码与使用方法

本文给出了模糊PID的代码,以及模糊PID的程序使用方法、参数调整方法

piginthesouth的博客 9123

输入图片有讲究!提升卡通化效果的5个拍摄建议

本文介绍了如何在星图GPU平台上自动化部署unet person image cartoon compound人像卡通化镜像(构建by科哥),实现高质量人像卡通化效果。该镜像基于DCT-Net模型,适用于将正面清晰、光线均匀的真人照片一键转换为生动自然的卡通形象,广泛用于社交头像、个性IP打造等场景。

weixin_35835030的博客 283

从零到一:Abaqus与Matlab联合仿真的自动化流程构建指南

本文详细介绍了如何构建Abaqus与Matlab联合仿真的自动化流程,涵盖基础架构设计、关键接口技术实现、结果提取与处理技术以及高级参数化优化流程。通过Python脚本作为桥梁,实现数据传递和任务控制,帮助工程师提升仿真效率。特别强调了版本兼容性、异常处理和性能监控等实用技巧。

weixin_29090089的博客 612

在Ultralytics YOLO中添加/更换模块详细指南

使用参数继承 my_module_args: &my_args [64, 3, 0.5] # 定义参数模板 backbone: - [-1, 1, MyModule, *my_args] # 引用参数。

MR_Colorful的博客 2583

iOS中使用UIBezierPath和CAShapeLayer画各种图形

CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你。 杂谈 在 CAShapeLayer 中,也可以像 CALayer 一样指定它的 frame 来画,就像这样: let layer = CAShapeLayer() layer.frame = CGRectMake(110, 100, 150, 100

大飞哥的专栏 1371

320x240 TFT屏的SPI DMA驱动避坑指南:基于HC32F460的时序调试心得

本文详细介绍了基于HC32F460 MCU驱动320x240 TFT屏的SPI DMA实战经验,涵盖硬件设计、波形诊断、DMA优化及高级调试技巧。重点解析SPI时序配置、DMA缓冲区对齐等常见问题,并提供逻辑分析仪波形诊断方法和性能优化策略,帮助开发者规避典型陷阱,提升显示性能。

weixin_42639246的博客 372

【如何快速的开发一个完整的 iOS 直播 app】(美颜篇)

来源:袁峥Seemygo 链接:http://www.jianshu.com/p/4646894245ba 前言 在看这篇之前,如果您还不了解直播原理,请查看这篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,美颜功能是很重要的,如果没有美颜功能,可能分分钟钟掉粉千万,本篇主要讲解直播中美颜功能的实

cleven 1031

lammps蒙特卡洛MC模拟案例

在lammps中,和MC相关的模拟命令有三个:fix gcmc、fix atom/swap、fix sgcmc。在一个lammps模拟中,mc和md可同时存在,间隔运行,所以设置fix sgcmc命令的同时,可以同时设置系综(nve、nvt或者npt)。lammps官网自带案例中也有一个fix sgcmc的案例,主要模拟FeCu合金的MC建模。sgcmc命令可应用到合金的模拟中,如短程有序模拟。MC运行间隔为100步,最终的浓度比例为0.02,也就是2%的Fe原子交换为Cu原子。大家好,我是小马老师。

lammps_jiayou的博客 1825

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

2026保姆级教程!港澳通行证照片怎么手机拍?规格要求+手机拍摄方法一看就会

求职在即顺便办港澳通行证:选多多职业照,证件照+职业装替换+印刷级清晰度一站搞定,求职照和证件照一次拍完两份用。就想要一张合规的港澳通行证照片:选立得一寸照,3步极简操作,标准尺寸全免费,长辈也能自己搞定。全家人同时办证或一人办多种证件:选奈斯证照助手,20+证件类型覆盖,港澳通行证、护照、驾照一个小程序全搞定。手头已有半成品照片只想换底色:选抠图喵,发丝级精度+9张批量处理,专项换底没有比它更精准的。不想用小程序习惯APP的:可以试美图秀秀的证件照功能,但操作步骤会多一些。会用专业软件PS。

asyncs的博客 80

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

放肆的使用UIBezierPath和CAShapeLayer画各种图形

CAShapeLayer 是 CALayer 的子类,但是比 CALayer 更灵活,可以画出各种图形,当然,你也可以使用其他方式来画,随你。 杂谈 在 CAShapeLayer 中,也可以像 CALayer 一样指定它的 frame 来画,就像这样: let layer = CAShapeLayer() layer.frame = CGRectMake(110, 100, 150, 10...

majiakun1的专栏 214

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS、Android 不能错过的 8 个新 App

iOS(3 款) 票夹:这些票据我来帮你留下 车票、机票、门票、电影票、发票……即便是在「全员二维码」的当下,各种票据依旧充斥着我们的生活,有许多的票据丢又丢不得,收拾起来又非常麻烦,常常是放好了一转眼就忘。不知你是否感受过找不着一张仅百万的公司发票时的慌张,那一刻我内心绝对是崩溃的。这款新上架的「票夹」,或许可以让你的票据整理稍微简单一些。 和许多整理应用类似,你可以通过拍摄票据照片储存信...

weixin_43901866的博客 661

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Unity游戏移植微信小游戏:三步法避坑与性能优化实战

WebGL技术作为在浏览器中运行高性能图形应用的核心方案,其原理是将C#等高级语言代码通过IL2CPP编译为WebAssembly字节码,在JavaScript引擎中执行。这项技术使得复杂的游戏逻辑能在Web环境中实现,其核心价值在于打破了平台限制,让应用无需安装即可获得接近原生的体验。在移动端H5游戏和小程序等应用场景中,WebGL是实现高质量图形渲染的关键。然而,从原生环境迁移到微信小游戏这类特殊WebGL容器时,开发者常面临内存管理与渲染性能的双重挑战。本文针对Unity游戏移植过程中的常见痛点,系统

weixin_34032792的博客 674

真4k测试样片_如何让自己的抖音视频更高清?测试一天后,偷偷告诉你

前段时间我们出了一期《在朋友圈发视频,怎样才能更高清?》,带着大家一起寻找了如何在微信上传更加高清的视频。在如今这个短视频的时代,大家似乎对如何在抖音快手等短视频频平台上传高清视频更感兴趣。既然如此,那就给大家安排!首先还是老规矩,依旧是先寻找平台的上传规则。相较于朋友圈的单一上传方式,抖音的上传方式更加多样化,可以通过网页端,APP端的+上传或者通过作品管理分别进行上传。另外,在抖音后台还有有一...

weixin_39559469的博客 2258

Unity微信小游戏性能优化实战:从内存管理到渲染调优

在游戏开发领域,性能优化是确保流畅用户体验的核心技术。其原理在于通过精细的资源管理与代码执行策略,平衡计算负载与硬件限制,从而释放软件的最大效能。这项技术的价值在于,它能直接提升应用的响应速度、稳定性和用户留存率,尤其在移动端和WebGL等资源受限环境中至关重要。常见的应用场景包括3D游戏渲染、复杂UI交互以及像微信小游戏这样的轻量化平台。本文将聚焦于Unity引擎在微信小游戏环境下的性能调优,深入剖析**内存管理**与**AssetBundle**策略等关键热词,探讨如何解决托管堆与WASM内存的双重压力

weixin_34050519的博客 345

GPEN集成微信小程序:扫码上传→云端修复→下载全流程演示

本文介绍了如何在星图GPU平台上自动化部署💆‍♀️GPEN - 智能面部增强系统镜像,实现老照片与AI生成图像中模糊人脸的云端修复。用户通过微信小程序扫码上传图片,系统在星图GPU上完成毫秒级AI重绘,支持毕业照修复、自拍增强等典型场景,全程零本地配置、高隐私保障。

weixin_42186015的博客 649

iOS图像编辑器实战:Core Image与Core Graphics双轨滤镜架构

图像编辑是移动开发中融合图形学、内存管理与性能优化的典型场景。其核心原理在于利用GPU加速的像素级处理(如Core Image滤镜链)与CPU可控的矢量绘制(如Core Graphics蒙版合成)协同工作,实现高帧率预览与高质量导出的平衡。该技术方案显著提升App在中低端设备上的响应速度与内存稳定性,广泛应用于摄影工具、社交平台贴纸系统及AR内容创作等场景。本文深入解析基于CIContext与CGBitmapContext的双轨渲染架构、归一化坐标系下的贴纸锚定机制,以及HEIC/ProRAW元数据保全策略

362
上一篇: iOS开发--毛玻璃效果(UIImage+Blur)直接拿去
下一篇: iOS开发--UIApplication(IconBadgeNum)
junfeng_
博客等级 码龄12年 3粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值