返回顶部
首页 > 资讯 > 移动开发 >iOS中一行代码实现 UIView 镂空效果
  • 185
分享到

iOS中一行代码实现 UIView 镂空效果

iosUIView镂空 2022-05-29 09:05:11 185人浏览 八月长安
摘要

这是一种实现 UIView 镂空效果的方案,可以快速实现任意形状的镂空、文字的镂空、带镂空的毛玻璃效果等。本质上是 UIView 的 maskView 效果。 前言 首先来复习一下

这是一种实现 UIView 镂空效果的方案,可以快速实现任意形状的镂空、文字的镂空、带镂空的毛玻璃效果等。本质上是 UIViewmaskView 效果。

前言

首先来复习一下遮罩效果的实现。如果我们有一张图片,又恰好有一个圆,当我们把圆设置为图片的遮罩时,会得到这样的结果。

代码实现看上去像是这样:


view.maskView = maskView;

那么问题来了,如果我们希望得到下面的结果,该怎么做呢?这看起来像是图层的相减,即原来的图层减去遮罩的部分。

可惜苹果爸爸不够贴心,没有提供方便的接口调用。让我们来看看可以怎么实现。

一、思路

我们的最终目标是,封装出一个接口,调用方式类似于 maskView 属性,可以很方便地对一个 UIView 做镂空效果。

注:以下用 originView 指代需要上效果的 view ,用 maskView 指代充当遮罩的 view

目前看来,可以从两个方向入手:

  1. 修改遮罩的绘制过程
  2. 修改 maskView 本身

方式一是指,在设置这个属性的时候,对 originView 的视图进行重新绘制,然后在绘制的时候,减掉 maskView 的区域。

方式二是指,当拿到 maskView 的时候,先对 maskView 本身先进行处理,将遮罩范围取反。然后再做遮罩效果,由于遮罩的区域已经相反,于是得到的结果也是相反的,就达到镂空的目的。

看上去方式二比较靠谱,而且最后是调用 UIViewsetMaskView: 来实现,还可以保留原来遮罩的一些特性。比如当修改 maskViewframe 的时候, originView 的遮罩位置也会相应改变。

二、实现

生成相反的遮罩图可以分为三步。假设一开始拿到的 maskView 是下面这样,让我们来看下,转换过程中遮罩图每一步的变化。

注:为了更直观的效果,图片中透明的部分用灰白相间格子来表示(以下相同)。

maskView 转化为 UIImage


UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);
CGContextTranslateCTM(UIGraphicsGetCurrentContext(),
           view.frame.origin.x,
           view.frame.origin.y);
[view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

这一步拿到了 maskView 对应的 image 图像。此时遮罩图的大小会被同步为 originView 的大小。

2、将

UIImage 转换为只有 alpha 通道的 CGContextRef


CGImageRef originalMaskImage = [image CGImage];
float width = CGImageGetWidth(originalMaskImage);
float height = CGImageGetHeight(originalMaskImage);
  
int strideLength = ROUND_UP(width * 1, 4);
unsigned char * alphaData = calloc(strideLength * height, sizeof(unsigned char));
CGContextRef alphaOnlyContext = CGBitmapContextCreate(alphaData,
                           width,
                           height,
                           8,
                           strideLength,
                           NULL,
                           kCGImageAlphaOnly);
  
CGContextDrawImage(alphaOnlyContext, CGRectMake(0, 0, width, height), originalMaskImage);

这时候的 alphaOnlyContext 对应的图像是下面这样,只保留了 alpha 通道。

3、将

CGContextRef 中的 alpha 值进行遍历转换


for (int y = 0; y < height; y++) {
  for (int x = 0; x < width; x++) {
    unsigned char val = alphaData[y*strideLength + x];
    val = 255 - val;
    alphaData[y*strideLength + x] = val;
  }
}
  
CGImageRef alphaMaskImage = CGBitmapContextCreateImage(alphaOnlyContext);
UIImage *result = [UIImage imageWithCGImage:alphaMaskImage];

转换后,获得的 result 图像是:

于是,我们就可以用 result 愉快地进行 mask 了。

三、使用

我们可以将上述的步骤,封装为一个方法,用 cateGory 来实现。


@interface UIView (MFSubtractMask)
- (void)setSubtractMaskView:(UIView *)view;
- (UIView *)subtractMaskView;
@end

这样调用起来就十分方便了,一行代码搞定:


view.subtractMaskView = maskView;

四、局限性

subtractMaskView 不会自动刷新

我们知道,当 UIViewmaskView 的内容动态修改时,会实时反映到 UIView 中。但在本项目中, subtractMaskView 属性会生成一张全新的图片来作为遮罩图,因为不会根据 subtractMaskView 的内容实时来刷新视图。如果需要更新,必须手动调用 setSubtractMaskView: 方法来重新生成遮罩图。

setSubtractMaskView: 不宜被频繁调用

setSubtractMaskView: 本质上是生成一个新的遮罩图的过程,该过程涉及图片像素的遍历转换,较为耗时,不宜频繁调用。

综上所述,这种方案适合只生成一次遮罩图的场景。

 五、源码

请到 GitHub 上查看完整代码。

总结

以上所述是小编给大家介绍的iOS中一行代码实现 UIView 镂空效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程网网站的支持!

--结束END--

本文标题: iOS中一行代码实现 UIView 镂空效果

本文链接: https://lsjlt.com/news/30180.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS中一行代码实现 UIView 镂空效果
    这是一种实现 UIView 镂空效果的方案,可以快速实现任意形状的镂空、文字的镂空、带镂空的毛玻璃效果等。本质上是 UIView 的 maskView 效果。 前言 首先来复习一下...
    99+
    2022-05-29
    ios UIView 镂空
  • CSS怎样实现镂空效果
    这篇文章主要介绍了CSS怎样实现镂空效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果原理主要利用css渐变实现一些不需要切图的背景镂空优惠券样式.mixinsTicke...
    99+
    2023-06-08
  • 怎么用纯CSS实现镂空效果
    小编给大家分享一下怎么用纯CSS实现镂空效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!background-clip: text背景被裁剪为文字的前景色。第一次是在 CSS-Tricks 看到的这个用法: 在 CSS-...
    99+
    2023-06-08
  • HTML怎么实现镂空遮盖层效果
    本文小编为大家详细介绍“HTML怎么实现镂空遮盖层效果”,内容详细,步骤清晰,细节处理妥当,希望这篇“HTML怎么实现镂空遮盖层效果”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。...
    99+
    2024-04-02
  • css3如何实现遮罩层镂空效果
    这篇文章将为大家详细讲解有关css3如何实现遮罩层镂空效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。先看看效果【 方法一:截图模拟实现 】原理:先截一张相同位置的图片,创建一个遮罩层,然后把图片定位在...
    99+
    2023-06-08
  • 一行java代码实现高斯模糊效果
    本文实例为大家分享了本地图片或者网络图片高斯模糊效果(毛玻璃效果),具体内容如下首先看效果图本地图片高斯模糊网络图片高斯模糊github网址:https://github.com/qiushi123/BlurImageQcl下面是使用步骤一...
    99+
    2023-05-31
    java 高斯模糊 ava
  • 怎么使用CSS实现中间镂空的图片遮罩效果
    这篇文章主要讲解了“怎么使用CSS实现中间镂空的图片遮罩效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用CSS实现中间镂空的图片遮罩效果”吧!中间...
    99+
    2024-04-02
  • iOS实现不规则Button点击效果实例代码
    需求 利用图片,实现一个如图的按钮组。 遇到的问题 如下图所示: 功能1、2、3、4的按钮可以实现点击功能。但是在红色方框四角的位置,也会响应相应的点击事件。 紫色方...
    99+
    2022-05-24
    ios 不规则 button
  • Android空心圆及层叠效果实现代码
    本文实例为大家分享了Android空心圆及层叠效果的具体代码,供大家参考,具体内容如下package com.bwei.test.zidingyiview2;import android.content.Context;import and...
    99+
    2023-05-30
    android 空心圆 层叠
  • css代码怎么实现进行中打点效果
    这篇文章主要介绍“css代码怎么实现进行中打点效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“css代码怎么实现进行中打点效果”文章能帮助大家解决问题。代码如下:<!doctype ...
    99+
    2023-07-04
  • 两行IOS代码实现轮播图
    此篇文章讲述IOS轮播图,仅需要几步就可以完成,很简单了。 第一步:利用cocopods导入KJBannerView组件 #import "KJBannerView.h" 第二...
    99+
    2022-05-26
    IOS 轮播图
  • JavaScript实现代码雨效果
    本文实例为大家分享了JavaScript实现代码雨效果的具体代码,供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> ...
    99+
    2024-04-02
  • iOS仿高德首页推拉效果实例代码
    目录1、滑动view的调用2、为视图添加滑动手势和tableview相关配置3、设置允许同时响应多个手势4、滑动相关逻辑处理4、注意点总结 上面是实现的效果,滑动的视图是新建的一个U...
    99+
    2022-05-27
    ios 高德 推拉
  • Android三行代码实现高斯模糊效果
    目录前言可行的方案BlurryBlurView(推荐)前言 设计:有了毛玻璃效果,产品的逼格直接拉满了呀 我:啊,对对对。我去 GayHub 上找找有没有好的解决方案吧 设计:Gay...
    99+
    2024-04-02
  • 如何通过纯CSS实现网页的平滑滚动背景镂空效果
    随着互联网技术的不断发展,网页的设计也日趋多样化和复杂化。一个好看的网页,往往需要注重细节和创新。其中,平滑滚动背景镂空效果是近年来越来越受欢迎的设计元素之一。这种效果可以使网页看起来更加生动、有趣,并且能够引起用户的注意和兴趣。在本文中,...
    99+
    2023-10-21
    CSS 平滑滚动 镂空效果
  • JavaScript canvas实现代码雨效果
    本文实例为大家分享了canvas实现代码雨效果的具体代码,供大家参考,具体内容如下 先看效果图 这个效果图是不是像极了以前电影里面的黑客技术,看起来蛮难的,其实操作起来还是挺简单的...
    99+
    2024-04-02
  • js+canvas实现代码雨效果
    本文实例为大家分享了js+canvas代码雨效果的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html> <h...
    99+
    2024-04-02
  • mybatis分页效果实现代码
    本文为大家分享了mybatis分页效果展示的具体代码,供大家参考,具体内容如下mybatis版本3.4以下结构:spring-mvc.xml<?xml version="1.0" encoding="UTF-8"?&g...
    99+
    2023-05-31
    mybatis 分页 实现代码
  • 使用HTML怎么实现一个代码雨效果
    本篇文章为大家展示了使用HTML怎么实现一个代码雨效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。绿色:彩色:背景色:绿色逐渐变浅:源代码:<!DOCTYPE html>&l...
    99+
    2023-06-09
  • 一行 Python 代码实现并行
    Python 在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学指导才是主要问题。常见的经典 Python 多线程、多进程教程多显得偏"重"。而且往往隔靴搔痒,没有深入探讨日常工作中最有用的内容。...
    99+
    2023-05-14
    Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作