Swift高效设置圆角图片的方法

Swift高效设置圆角图片的方法,第1张

App中圆角常用的场景有:UIImageView(头像及cell中)、Button按钮(按钮)、Label文字(文字)等等。这些控件的圆角设置原理都是一样的,这里就以UIImageView圆角设置为例。

1系统提供的圆角设置属性:

cornerRadius属性本身并没有什么问题,而masksToBounds属性会造成离屏渲染从而影响性能。

ps:Offscreen rendering(离屏渲染):离屏渲染指的是在图像在绘制到当前屏幕前,需要先进行一次渲染,之后才绘制到当前屏幕。在第一次渲染时,GPU(Core Animation)或CPU(Core Graphics)需要额外的一块内存来进行渲染,完成后再绘制到屏幕。offscreen到onscreen需要进行上下文切换,这个切换的性能消耗是昂贵的。

事实上,当界面中单个或少量控件用此方法设置圆角,并不会影响性能,我们并不需要担心,但如果界面中大量使用此方法设置圆角,比如TableView中显示圆角等,滚动时就会出现界面卡顿,这当然不是我们想要看到的。

2为了不让图像离屏渲染:

可以自己绘制圆角:

//也可以直接用贝塞尔设置圆形路径进行绘制

对上面两个绘制圆角的方法性能进行了简单的测试,分别进行多轮的100次测试,时间消耗上差别基本无几,大家可以选择任何一种方法使用。

ps: UIGraphicsBeginImageContextWithOptions方法参数说明:

size —- 图形上下文的大小

opaque —- 透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。

scale —– 缩放因子,可以用[UIScreen mainScreen]scale来获取,但实际上设为0后,系统就会自动设置正确的比例了。在Retina屏幕上最好不要自己手动设置他的缩放比例,直接设置0,系统就会自动进行最佳的缩放

关键在于:绘制圆角最好在子线程进行,这样不会阻塞主线程,用户体验上会更好,特别是对于UITableView列表这样的场景,异步绘制是必须的,不然UITableView滑动可能会出现卡顿的情况。

可以将设置圆角方法放在UIImageView+Extensionswift(Swift在30以后没有Category,Extension文件之分了)文件中,创建setCornerImage方法:

在需要设置圆角的地方直接调用即可,例如:

科技 是一种人文素养,我认为 Swift Playgrounds App 的核心定位正是如此。

未来世界创新、创业、创造的大门,需要我们用一种有着人文温度的方式去开启。

我自己从初中开始看硅谷三大春晚——Apple WWDC 开发者大会、谷歌I/O 大会、微软Build 大会;在高中的时候,虽然身为文科生,但是开始了装「黑苹果」、自学编程的神秘炼金术之旅。Swift 因此成了我的计算机语言母语,而大学时期也很幸运地入选了 WWDC18 奖学金计划,能够带着我们团队自己开发的 App 见到了库克。我们后来休学创业,拿了几轮融资,至今还在这个波诡云谲却充满魔力的创业场拼搏。

这些过去的经历,都成了乔布斯所说的「connecting the dots」的一部分。我和一家做少儿素质与编程教育的机构也有着不少的合作,也带过几支天才少年队伍,看着他们忘我地投入,看着他们迸发着颠覆性创造力的光芒。

由 Apple 推出的编程工具 Swift Playgrounds 近期推出了 40 大版本,我使用它开发了一个简单的疫情数据看板 App,并以此作为一次简单的体验,将过程中的思考和体悟和大家分享。

我们为何学习编程、如何学习创造,Apple 给了我们他们的思考。虽然 Swift Playgrounds 现在还充满了各种瑕疵,但我们也看到了全新的可能:AR、AI、传感器、多维交互、物联网,这些前沿的技术,以及伴随其中的人文主义光辉,都能够在这个小小的设备中,经由每一个开发者的研磨,如同坩埚一般,炼就出自己的结晶。

让我们开始吧。

注:本文中所有新冠疫情数据来自 腾讯开放平台数据接口,仅用作产品功能效果演示,不具有任何防疫相关参考价值,新冠疫情准确数据,请查阅官方数据平台。

在 Swift Playgrounds 中写一个疫情数据 App,整个体验充满了惊喜与迷思,总之情绪如同一杯馥郁的咖啡,浓烈而复杂。

我一直在用一台 2017 年的 105 英寸玫瑰金 iPad Pro,它伴随了我的整个大学到现在创业的时光。它曾陪伴着我去过 WWDC18 面对面见过库克(没错)。然而自从升级 iOS 14 以来,我开始对其体验心生不满,尤其是 Swift Playgrounds 在更新 40 大版本前的频频闪退和卡顿问题着实让我头大。

虽然我从朋友那里搞来了一台 129 英寸的全面屏 iPad Pro,但由于种种原因没有升级到 Swift Playgrounds 开发 App 所需的 iPadOS 152 的环境,于是最终还是投奔到了自己的陈年旧相识的怀抱。

好在 Swift Playgrounds 40 对系统兼容性与性能的优化,让我瞬间觉得「爷青回」。我尝试了直接在 iPad 上触屏、触屏 + 键盘、触屏 + 键盘 + Magic Trackpad 的体验,确实觉得如果没有一套像样的键鼠方案做配合,效率依然会大打折扣。

由于 macOS Monterey 121 依然没有开放 Universal Control 通用控制功能,我最终选择将 iPad 画面投屏到 Mac 的显示器上。

作为一个简单的尝试,我打算写一个实时展示疫情数据的看板 App。

SwiftUI 配合 iPad 的屏幕 *** 作逻辑,可以说很大程度降低了 UI 部分开发的复杂度,右侧的 App 预览响应迅速,提供了所见即所得的及时反馈。

左侧的代码窗口也新增了 Xcode 样式的自动补全,在多数情况运转良好,然而也会在不少场合耍个脾气,考一考你「默写」代码的能力。当然我期待这些问题能够尽快在后续版本中得到改善。

我们也可以直接编译代码,Swift Playgrounds 则会开启一个新窗口来运行应用,日志则均可通过自带的控制台输出。

Swift Playgrounds 可以像在 Xcode 编辑 plist 文件一样,为应用增加系统级能力支持。而同时,Swift Playgrounds 也允许开发者使用 Swift 包管理器来在线获取第三方模块的支持。

App 可以选择自带的占位符或者自定义作为图标,并且打包编译,发布到 App Store。Swift Playgrounds 自带的手绘风格图标颇有「Everyone Can Code」的质感。

写完的 App 也可以直接发布 App Store 审核。

iPadOS 上 Swift Playgrounds 开发 App 的 swiftpm 工程无法在 macOS 上的 Swift Playgrounds 中打开(或许还需坐等 macOS Swift Playgrounds App 更新),但是可以在 Xcode 的 Swift Playgrounds 模块运行。

我们现在能够看到 macOS 上 Xcode App 中的 Swift Playgrounds 功能模块、macOS 独立的 Swift Playgrounds App 与 iPadOS 上的 Swift Playgrounds App 三者并存且互相有所不兼容的情况。对于初学者而言,若不加了解,这确实是一条令人有些困惑的产品线。当然我相信 Apple 会在后续解决这一问题。

此次体验下来,我认为新版的 Swift Playgrounds 也还存在以下不足:

对于想通过 Swift Playgrounds 入门编程的新手,我也在这里提出一些个人建议。

首先是设备,我手中的 2017 年款 iPad Pro(A10X 处理器)运行 Swift Playgrounds 40 没有出现明显的性能瓶颈,因此我姑且认为往后的新机型应该都有着不错的性能表现。

文档:前文说到,现有的 Swift Playgrounds 40 如果要以 IDE 的要求来看,还缺少必要的类型提示和文档内容的说明。这时候我们也可以选择手动查阅开发者文档,这是 Apple 对各类系统框架事无巨细的说明。在 Swift Playgrounds 更早版本的更新中,Apple 已经将大部分的开发者文档内置到了 Swift Playgrounds 中,我们可以在工具中找到文档的查询入口。或者,我们可以使用浏览器访问 Apple Developer 开发者网站 查询文档。

Swift 语法入门:Swift Playgrounds 在更早版本中,已经提供了 游戏 化 Swift 语言学习的各种模块,如果你是 Swift 语言的新手,可以通过学习官方提供的学习编程 1、2、3 和其他一系列的学习模块来 探索 Swift 语言。

SwiftUI 入门:SwiftUI 是 Apple 发布于 2019 年 WWDC 大会的基于 Swift 的UI框架,结合了代码 UI 编辑和 Storyboard 图形化 UI 绘制的优点。因此 Swift Playgrounds 默认将 SwiftUI 作为创建一个空白 swiftpm 工程后的初始界面模板。

如果你对 SwiftUI 还不熟悉,网上有不少优秀的教程内容可以学习,你可以在 Swift Playgrounds 跟着教程一起学习。当然,有时候自动补全功能的失效会给学习者带来一点点困惑,我希望这个 Bug(但愿不是一个 feature)能够被尽早修复。当然,你也可以使用 UIKit 来实现界面,不过我认为现有的工作流更为 SwiftUI 量身打造。

尝试 AR 体验:如果你想在 Swift Playgrounds 开发的 App 中体验一下 AR,Apple 的 AR Quick Look 页面提供了不少开放的模型。我们可以通过创建 ARQuickLookPreview 来加载各类 USDZ 文件。

社群:现在基于 Swift Playgrounds 开发 App 的爱好者社群还在萌芽阶段,因此找一个有 iOS 等生态开发经验的朋友能够极大提高你的学习速度。当然,你也可以创建一个社群让好朋友们一起交流讨论。比如少数派本身便是这样一个不错的社群,期待各位能在其中共同学习,各显神通。

当然,瑕不掩瑜,我依然为这一次 Swift Playgrounds 的重大升级深感高兴。在 iPad 上进行「真正」地开发 App 的呼声从 iPad 推出之日起便此起彼伏。我在初中拥有第一台 iPad 2 的时候,就千方百计地尝试用它来开发点什么,而这一次的 Swift Playgrounds 升级则真正地表明了 Apple 的立场。

我一直不很在意关于 iPad 生产力的争论。然而,我和身边不少用户切身体会到的,确实是 iPad 作为一个 科技 产品,给人源源不断带来的幸福感。书桌旁、画架上、被窝里常常有着它和我形影不离。因此,和 Mac 相比,我一直觉得 iPad 是一个让人更少异化、更多自由的产品形态。

因此 Swift Playgrounds 正如其名称一般,也是一个大家能够在代码、多媒体内容与知识的 探索 与交互中自如玩耍的地方。在未来,并不会人人都做程序员,但 Everyone Can Code 能够真正让 科技 作为一种人文素养,让每个人都徜徉其间,用开放包容和智慧的心态,面向与人类走向共融共生的通用智能。

库克表示他不说元宇宙一词,Apple 看好 AR。

AR、VR、AI、物联网、区块链、数字孪生、量子计算、Web3、元宇宙…… 各种词汇总是在不经意间成为资本的宠儿,却又在悄无声息中急流勇退,大浪淘沙留下一波真正做事的人。

AR 作为在 iPad 先行的验证,并被着力主推的技术能力,或许不久就会以全新的硬件形态与大家见面。运行在 iPadOS 之上的 Swift Playgrounds,结合 Apple 软件全家桶的一系列应用,将进一步将多媒体的创造能力带给每一个人,而这次会将 3D 沉浸空间体验的创造也逐步纳入进来,Swift Playgrounds 40 正是起点。

往后,Swift Playgrounds 结合 Reality Composer App 和大幅升级改造的「地图」应用,使用 USDZ 格式文件,配合或将推出的穿戴式硬件设备,有可能能够拓展成为一个「3D 沉浸式体验编辑器」。它的潜力,可以是下一个时代的「Word」。当然,我们要看 Apple 将如何打这一套组合拳。

最重要的是,机遇永远不在一家公司手中。创新、创业、创造将是每个人的全新可能,而这正是 Swift Playgrounds 作为这样一个赋能人的工具,在根本上的意义:Give people wonderful tools, and they'll do wonderful things

凡是过去,皆为序章。

UIScrollView是IOS中非常有用的一个组件。它是通用组件UITableView的基类也是放置尺寸大于一个屏幕的内容时很好的组织方式。本教程会介绍UIScrollView的下列用法:

如何使用UIScrollView浏览大尺寸。

如何在缩放时保持UIScrollView中的内容居中

如何在UIScrollView中嵌入复杂的显示层次关系。

如何使用UIScrollView的分页(paging)特性, 联合使用UIPageControl在不同页面之间移动。

通过“偷窥”UIScrollView得到前一页,后一页还有当前页的缩略图。

其他内容!

本文假设你熟悉Swift语言和IOS开发。如果你完全是一名初学者, 你可能需要先学习一下本站的其他课程。

本文还假设你知道如何使用Interface Builder在view中添加对象和在你的代码和Storyboard连接outlets。 如果你刚刚接触Storyboards和Interface Builder, 你可以在开始本教程之前线学习一下本站的Storyboards教程。

开始

打开Xcode创建工程。选择File\New\Project…, 接下来选择iOS\Application\Single View Application模版。 在product name输入框中输入ScrollViews, language选择Swift, devices选择 iPhone

单击Next选择工程文件的保存位置。

之后下载工程的资源压缩包, 然后将解加压后的文件拖拽到工程的根目录。并确保选中了“Copy items if needed”复选框。

本文会介绍Scroll view 的四种不同使用方式, 工程采用一个tableview来提供这四个选项。每个选项打开一个新的视图控制器(view controller)来展示scroll views的一种用法。

下图展示了完成时storyboard的状态:

通过下列步骤创建一个tableview:

打开Mainstoryboard删除当前场景。 选择view controller (单击 storyboard) 然后删除它。

关闭Auto Layout功能。在Utilities面板中选择File Inspector, 取消Use Auto Layout复选框的选中状态。这会d出一个警告窗口。在d出窗口中确保“Keep size class data for:”选中了iPhone。然后选择Disable Size Classes。

接下来, 添加一个Table View Controller,从Object Library中拖拽一个Table View Controller到storyboard。

选中刚添加的table, 然后在菜单中选择Editor\Embed In\Navigation Controller。

同时选中table view和table view controller, 将Attributes Inspector中的content type修改为Static Cells(如下图所示)。

在文档概要视图中Table View单击下面的按钮显示storyboard层次关系视图,然后选中Table View Section 将行数设置为4。如下图所示

依次编辑table view的每一行, 将style设置为Basic,编辑显示的标签:

Image Scroll

Custom View Scroll

Paged

Paged with Peeking

注释: 由于你将每一行的style设置成了“Basic”, 表单的每一行会出现额外的标签子组件。你要再次展开每行的子项目来进行编辑。

保存storyboard, 之后构建并运行。你会看到你编辑的table view如下图所示不过现在table view中还没有任何东西 – 但你可以改好它!

用户界面控件是所有应用程序重要的组成部分之一。它们以图形组件的方式呈现给用户,用户可以通过它们与应用程序进行交互。苹果提供了一套控件,例如 UITextField,UIButton,UISwitch。通过工具箱中的这些已有控件

我们在IOS开发中,时常需要将一些原本是方形的剪切成圆形或者边框是曲线的样子,表现得活泼生动一些

注意:因为最近在尝试用Swiftl开发,所以这里的语言使用的就是Swift,OC的语法也是相近的

这是修改之前的:

然后这是修改之后的:

第一种:通过图形绘制

extension UIImage{

func createImage(isCornored: Bool = true,size: CGSize = CGSizezero,backgroundColor: UIColor = UIColorwhite,callBack: @escaping (_ image: UIImage) ->()) {

//在子线程中执行

DispatchQueueglobal()async {

let rect = CGRect(origin: CGPointzero, size: size)

//1 开启上下文

UIGraphicsBeginImageContext(size)

//2 设置颜色

backgroundColorsetFill()

//3 颜色填充

UIRectFill(rect)

//4 图像绘制

//切回角

let path = UIBezierPath(ovalIn: rect)

pathaddClip()

selfdraw(in: rect)

//5 获取

let image = UIGraphicsGetImageFromCurrentImageContext()

//6 关闭上下文

UIGraphicsEndImageContext()

//回到主线程刷新UI

DispatchQueuemainasync(execute: {

callBack(image!)

})

}

}

}

第二种:剪切圆角

//设置圆角半径(通过设置这个的大小,越接近你的矩形宽度,圆的形状越明显)

iconImageViewlayercornerRadius = 50

//必做的一步

iconImageViewlayermasksToBounds = true

//设置边框宽度

iconImageViewlayerborderWidth = 5

//设置边框的颜色

iconImageViewlayerborderColor = UIColorblack

这两种方法都挺实用的,不过第二种比较简短,第一种适合用来提高自己的逼格吧

比如说,你们也许希望我们这个应用中还有以下这些自动的功能:被波浪号(~)括起来的文本会显示艺术字体。被下划线(_)括起来的文本会显示斜体。被破折号(-)括起来的文本会在其上划一道横线。所有大写字体会显示红色。如何用TextKit实现上述这些功能就是这篇文章将要向同学们介绍的内容。在学习这些之前,大家需要先理解在TextKit中,文本的存储系统是如何工作的。下面的图展示了TextKit中对文本进行存储、渲染、显现的基本流程:在开发过程中,如果你创建了UITextView、UILabel或UITextField,那么同时Apple会在幕后自动创建上图中的这些类。你可以使用这些类默认实现的行为,也可以自己实现这些类,从而达到你想要的一些对文本控制的行为。让我们来看看这些类的作用:NSTextStorage的功能是存储文本,并通过字符串属性渲染文本。当文本内容发生任何变化的时候,它会告知布局管理器(LayoutManager)。你们也许脑海中已经有了一点想法,那就是实现一个NSTextStorage的子类,以便实现当文本更新时动态改变文本属性的功能,Bingo!想法基本正确(在后文中你将会看到它的运用)。NSLayoutManager的功能是从NSTextStorage中获取文本并在屏幕上渲染文本。它将作为你应用中的布局引擎。NSTextContainer的功能是在屏幕上描绘一个几何图形区域,要显示的文本就是在这个区域内进行渲染的。每个TextContainer一般都和一和UITextView相关联。你可以实现一个NSTextContainer的子类,描绘一个复杂的几何图形,让文本在其中进行渲染。如果想要在我们的应用中实现动态文本格式的功能,那么就需要实现一个NSTextStorage的子类,然后根据用户键入的字符动态的设置文本格式属性。

以上就是关于Swift高效设置圆角图片的方法全部的内容,包括:Swift高效设置圆角图片的方法、只要一个 iPad,手把手教你给 iPhone 开发应用、如何使在Swift中使用UIScrollView进行滚动和缩放等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10147685.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存