Tag: Swift 4

UIScrollView:简介

在iOS上,很多场景都具有与UIScrollView相关的有效UI,甚至出色的UITableView和UICollectionView也在其顶部实现。 以下屏幕截图是App Store应用程序中UIScrollView用法的示例。 WWDC的一次演讲甚至提到App Store上超过80%的应用都在使用UITableView,UICollectionView或两者都使用。 UIScrollView是做什么的? 很容易实现UIScrollView提供的主要功能是使其子视图可滚动,因此用户可以在同一页面上查看更多/其他内容。 由于它在平坦表面上显示内容,因此自然可以水平和垂直滚动。 人们有时会忽略UIScrollView提供的另一个关键功能是“缩放”。 缩放可以帮助用户拥有更多内容,向他们展示更多详细内容。 摘要: UIScrollView可帮助用户轻松地与单个页面上的丰富内容进行交互。 滚动和缩放是它的两个功能动作。 阅读更多: UIScrollView:如何在代码中使用AutoLayout

Swift 4.1发布过程

这篇文章描述了Swift 4.1的目标,发布过程和预计时间表。 Swift 4.1是对Swift 4.0的源兼容更新。 它将包含对核心语言的一些附加增强功能,以及对Swift软件包管理器,Linux上的Swift的改进,以及对编译器和标准库的总体质量的改进。 Swift 4.1与4.0 不二进制兼容。 它包含各种幕后更改,这是在Swift 5中稳定Swift ABI的工作的一部分。 Swift 4.1计划于2018年上半年发布。 源兼容性 使用Swift 4.0编译器构建的绝大多数源(包括使用Swift 3兼容模式的源)都应使用Swift 4.1编译器进行编译。 在某些特殊情况下,这不能绝对保证。 这包括通过使用长期期待的泛型功能解决了使用泛型的问题,从而解决了编译器中的错误行为或极端情况。 但是,人们的期望是,大多数项目将在没有源代码更改的情况下继续构建。 -swift.org

Swift4第10天关闭(1)

闭锁是功能独立的区块链,可以在程序之间被传递和使用。像是之前提到的嵌套状函式(Nested Function),就是一种闭包。 闭包有三种表示方式: ・函式就是一种有名字的闭包・巢状函式是一种有名字且被包在其他函式中的闭包·闭包表达式是使用简洁的语法来描述一种没有名字的闭包,可以在程式之间传递及使用。 Swift提供了一种叫做sorted的方法,根据我们提供的排序闭包,将已知类型数组的值进行排序,再次排序完成,sorted好的。我们可以用sorted()去使用sorted的功能,再没有特别设定之下,sorted的功能就是将Array中的数值从小到大分开,字串则是照字母顺序: 如果我们想要让Array由大到小排序(字串则反之),可以透过定义功能,并使用sorted(by:): 闭包表达式(Closure Expression)是一种用简洁语法建立匿名函式的方式。同时提共了优化语法,可以使程式码变得更好读。 {(参数)->返回值类型别 内部程式 } 从上面的程式看到,与一般函式相同的是闭包同样有一个大括号将程式包起来,不过省略了名称,包着参数的小括号放到大括号里面,然后返回型别,再接一个在执行内部程式中 在这边我们不是建立一个函数,而是将这些参数以及回传值等等包在一个大括号中,最后再用 从总体而言型别 因为排序闭包是实际参数传递给函数,所以Swift可以判断他的形式参数类型及回传型别 单表达式闭包隐式回传 单行表达式闭包可以通过隐藏隐藏return来隐式回传单行表达式的结果 参数名称缩写 Swift为闭包提供参数名称缩写功能,能直接以$ 0,$ 1,$ 2这种方式来依序呼叫闭包的参数。缩写的型别会透过函式型别自动预设,所以在也会同被省略 运算子函式 Swift的String定义了关于大于符号等特定符号的实现,与sorted所需要的相符合 ・ Swift4 Day-01基本语法・ Swift4 Day-02选项及无 ・ Swift4 Day-03集合类型—数组 ・ Swift4 Day-04集合类型—设置 ・ Swift4 Day-05集合类型—字典 ・ Swift4 Day-06控制流程(1) ・ Swift4 Day-07控制流(2) ・ Swift4 Day-08功能(1) ・ Swift4 Day-09功能(2) 电子邮件:albert.Ch1994@gmail.com

掌握CoreData(第15部分,多线程并发策略父级-子级用例1)

使用父子上下文解决了实际问题 托管对象上下文是用于处理托管对象的内存暂存器。我们使用多个托管对象上下文来执行两种类型的任务。 1)对于前面部分中讨论的长时间运行的任务。 在这一部分中,我们将在实际应用中执行此操作 2)在其他情况下,例如在对用户数据进行编辑时,将托管对象上下文视为一组更改即可很有用,如果应用程序不再需要它们,则可以将其丢弃。 使用子上下文使这成为可能。 在下一部分中,我们将介绍 在本教程中,您将通过使用GooglePlayViewerApp应用程序来使用多个托管对象上下文,并通过添加多个上下文以几种方式对其进行改进。 入门 该教程入门项目是一个Google Play查看器应用程序,用于演示。当应用程序首次启动时,您将重定向到登录屏幕,如图1所示。单击Export时,会将47472 google play应用程序数据加载到Core Data中。 点击“登录”按钮后,它将重定向到列表屏幕,其中将显示所有应用程序名称,如图2所示。 项目结构 在图3中显示了项目结构的屏幕截图 ViewController →负责登录屏幕任务。 它具有点击导出和登录按钮的操作方法。 点击登录按钮时,它将重定向到列表屏幕。 点击导出按钮,它将把csv文件中的数据加载到核心数据中,并将其保存到持久性存储中。 googleplaystore.csv→包含所有Google Play应用信息,总计47472 ,如图4所示。 GooglePlayListViewController →负责显示来自Google Play应用的列表。 它从核心数据中获取数据并在表格视图中显示。 AppDelegate→负责创建Core数据堆栈。 GooglePlayViewerApp.xcdatamodeld→包含Google play实体架构和配置 转到GooglePlayViewerApp.xcdatamodeld →选择Google Play实体,如图5所示,包含Google Play csv数据所需的所有属性 观察/问题 确保首先删除该应用程序。 运行该应用程序,将出现登录屏幕。 点击文本框并开始输入,它可以正常工作。 现在,点击导航栏左上方的导出按钮,立即再次开始键入,您将看到UI挂起。 导出操作需要几秒钟,并且会阻止UI响应诸如键入之类的交互事件。 怎么了 如图7所示,由于此应用程序仅使用一个托管对象上下文 ,该上下文将csv数据填充到主线程上的Core Data中。 当您点击“导出”按钮时,将发生以下情况 将包含47472数据的csv文件的所有内容加载到主线程的data变量中 获取在主线程上创建的托管对象上下文引用 在主上下文上创建了GooglePlay CoreData实体,并填充其属性 将数据推送到持久性存储 正如您在图7控制台日志中看到的那样,大约6秒的应用程序主线程将被此任务阻塞,您可以想象当应用程序冻结将近6秒时,用户的反应是什么 使用并发提高性能 […]

如何使用MSL(金属着色语言)向UIImage添加效果。

如果要创建可以更快,更简洁地处理的图像效果,则使用着色器语言是更好的方法之一。 例如,此封面图像由GPU用几行着色器代码处理。 而且我已经使用着色器发布了2个应用程序(FastFilm / PXSL)。 我将向您展示如何用MSL编写。 Xcode 10.0(Swift 4.2) iOS 12.0 Metal&MetalKit在iOS 9和更高版本上可用。 但是,它们不适用于iPhone 5和5C。 ImageProcessor.Shared.Setup() let outImage = ImageProcessor.Shared.Run(inImage) 感谢您的阅读。 请尝试重写着色器程序。 下次,我将撰写有关如何使用MSL创建电影风格效果的文章。 顺便说一句,这是我的第一篇文章! 所以..最后, “ Hello Medium” 。

一种使用MVVM的表格视图的POP方法。

首先是第一件事。 POP代表面向协议的编程。 POP上有很多现成的资料,因此我将不对其进行详细介绍。 MVVM代表模型视图视图模型。 这是一种设计模式,其中有类或类型,这些类或类型可以分为三类,即模型,视图和视图模型。 这是一篇很棒的文章 了解MVVM。 我选择MVVM而不是MVC(模型视图控制器),因为MVC通常会导致整体式Massive View Controller。 现在开始。 我们首先从为tableviewcellmodel定义协议开始。 tableviewcellmodel将包含该单元格的标识符。 它还将包含其他数据以配置单元。 我们还需要可以使用此tableviewcellmodel配置的tableviewcell。 因此,我们还定义了可配置单元协议。 在这里,无论我们使用POP布局的任何框架都可以通过非常干净的表视图数据源来实现。 我们创建RBConcreteTableViewController ,它是UITableViewController的子类。 它具有RBTableViewModel类型的属性tableViewModel,这意味着它可以使用符合RBTableViewModel的任何类型。 我们重写viewDidLoad()以使用tableViewModel配置tableView。 然后,我们获得了UITableViewDatasource方法的样板代码。 如您所见,该代码更加简洁。 您可以更早地跟踪错误。 我们还避免使用非常庞大的视图控制器。 通过为可配置表视图创建协议,可以出于一致性目的而改进此代码,但是您可以通过遵循上述可配置单元协议的模板来轻松实现此目的。 此处提供了此POP方法的源代码。 您可以继续改进自己的实现。 你喜欢这篇文章吗? 也许尝试以下方法之一: 在Swift中使用ExpressibleByArrayLiteral简化生活 驯服宽松的通知 断点作为调试内容提供者 在核心数据中使用可变类型作为可转换属性的危险 请提供任何反馈以进行改进。 我的TapChief个人资料如下:

Swift —在iOS中以编程方式创建自定义TableView单元格

让我解释一下我的情况,我是IOS开发人员大约4年。 当我尝试构建我的第一个应用程序时,我使用情节提要,xib之后,我将自己转换为以编程方式创建所有内容。 我并不是说这是最好的方法,也不是唯一的方法,但我更喜欢这样。 当我以编程方式创建某些东西时,我感到尽可能地自由。 这是我的第一个中型故事,对不起,如果我做错了什么。 好,开始吧 如果要在tableView单元上自定义并添加其他功能,则可能需要创建自定义tableView单元类。 我说可能是因为当前的TableView单元格具有一些默认元素,这些元素可以在某个时候自定义您的单元格。 但是,如果您想自定义更多内容,我将在本文中进行解释。 我将逐步向您展示所有内容,并且我将使用快速的语言。 这是我们将要构建的单元: 步骤1创建Xcode项目并修复设置: 之后,使用Single View App创建Xcode项目,因为我们不使用情节提要,因此我们需要修改一些设置。 所以这是我们应该解决的问题; 首先从项目设置的主界面中删除主菜单。 您可以在下面找到突出显示红色的图像。 然后我们打开AppDelegate.swift文件,所以我们需要告诉编辑器哪个视图控制器是根目录。我们仅为此项目修改didFinishLaunchingWithOptions函数。 AppDelegate.swift代码应类似于 完成此过程后,输入文件名“ Product”,然后单击“创建”。 现在,您应该在Project Navigator上看到Product.swift文件。 点击该文件,然后进行编辑。 如您所见,我创建了Product模型数组,因此我们可以轻松地将数据填充到TableView中。 我还创建了ProductProductArray,用于将虚拟数据添加到我的数组中。 因为我们不使用情节提要,所以我们需要向其中注册单元 步骤4创建自定义TableView单元格类并将其设置为TableView 在创建自定义TableViewCell之前,我要提到锚点和约束。 再一次,因为我们不使用Storyboard,所以我们需要通过编程来添加约束,所以我使用从Brian Voong那里学到的一些扩展,他拥有youtube频道和网站(称为letsbuildthatapp.com),我强烈建议他开始学习更多。 您将在下面看到扩展屏幕截图和整个代码。 如您所见,我们使用“ ProductCell.self”更改了tableView.register单元名称,我们也修改了cellForRowat函数,我们传递了Model而不是Property。 终于这是到目前为止的结果 仅剩一步之遥,您可能意识到我们的按钮不起作用,因此我们将使用委托使其起作用。 让我们来看看。 首先,我们在Product Cell中创建一个名为ProductCellDelegate的协议,然后添加两个函数以增加和减少数量。 我们的协议应该是: 结果是: 感谢您的阅读。 这是整个项目的GitHub链接: https://github.com/kemalekren/Sample-Custom-TableView-Project-

掌握CoreData(第11部分:多线程并发规则)

假设您是在首次启动应用程序时将数百个或数千个主线程上的记录从捆绑数据导入Core Data中的? 结果可能是戏剧性的。 例如,您的应用程序可能由于启动时间太长而被Apple的监视程序杀死,这会显着降低UI性能,甚至可能导致其完全冻结,这不是良好的用户体验。 使用并发,您可以将任务导入其他线程,从而使您的主线程空闲,并且用户可以在不知道后台任何内容的情况下进行交互。 核心数据并发 并发是同时处理多个队列上的数据的能力。 提交到这些队列的工作在线程上执行。 核心数据,多线程和主线程 在核心数据中,作为核心数据堆栈核心的托管对象上下文可以与两种并发模式一起使用,这两种并发模式由NSMainQueueConcurrencyType和NSPrivateQueueConcurrencyType定义。 NSMainQueueConcurrencyType 专用于与您的应用程序界面一起使用,并且只能在始终在主线程上运行的应用程序的主队列中使用。 如前所述,它只能在与应用程序界面(UI)相关的工作中使用。 避免对此进行数据处理 。 ,就像将数据从JSON导入Core Data一样 NSPrivateQueueConcurrencyType 配置在初始化时创建自己的队列,并且只能在该队列上使用。 因为该队列是私有的,并且在NSManagedObjectContext实例内部,所以只能通过performBlock: 和 performBlockAndWait :方法对其进行访问。 在进行编码部分时,我们将对此进行深入研究。 零件中使用了 什么托管对象上下文 让managedObjectContext = appDelegate.persistentContainer.viewContext 以前,我们非常频繁地使用上述代码,并且我们从persistentContainer实例属性viewContext获取上下文。 顾名思义,其并发类型应为NSMainQueueConcurrencyType。 使用NSPersistentContainer时,viewContext属性被配置为NSMainQueueConcurrencyType上下文 PersistentContainer还具有两种方法 performBackgroundTask:和newBackgroundContext,与之关联的上下文被配置为NSPrivateQueueConcurrencyType。 核心数据旨在在多线程环境中工作。 但是,并非Core Data框架下的每个对象都是线程安全的。 要在多线程环境中使用Core Data,请确保: 受管对象上下文绑定到初始化时与之关联的线程(队列) 从上下文中检索到的受管对象被绑定到上下文所绑定到的同一队列 (将通过本节中的代码看到这两点) 规则1 受管对象上下文绑定到初始化时与之关联的线程(队列)。 转到目标→编辑方案→参数→添加参数“ -com.apple.CoreData.ConcurrencyDebug 1 ”,如图2和3所示。我们只是启用了Core Data Concurrency Debugging 如您在图4中看到的,我们正在打破这一规则。 我们正在使用在其他线程的主线程上创建的托管对象上下文。 我们通过执行许多任务来完成此任务 首先使用持久容器 […]

Swift 4的Codable

几乎可以肯定的是,在应用程序开发过程中的某个时刻,您需要(或者您将很快:])序列化一些对象或值,并解析对模型的JSON响应。 如果我是对的,那么这可能值得您花时间。 在Swift中,我们曾经使用NSCoding协议来序列化对象。 为了符合NSCoding我们常常最终使类从NSObject继承,然后经过一会儿cha和samba以及异常长的时间之后,我们最终设法实现了预期的init(coder:)和encode(with:)方法。 但是structs正确吗? 好吧,大多数人在将第三方框架引入其项目时找到了解决方案。 希望有关序列化和映射的斗争已经结束。 现在怎么办? Swift 4引入了一个称为Codable的协议,该协议由其他两个协议组成: Encodable和Decodable 。 Codable允许我们几乎无需费力地对classes , structs和enums进行序列化和反序列化。 包括String , Int , Array , Dictionary在内的大多数类型都符合此协议。 因此,当我们创建一个包含已经符合Codable属性的新类型时,我们无需再编写一行代码。 如下所示, Person类型符合Codable : struct Person:可编码{ 命名:字符串 年龄:整数 让朋友们:[人]? } 将 Person 序列 Person JSON: let person = Person(姓名:“ Brad”,年龄:53,朋友:无) //对不起,Bradlet编码器= JSONEncoder() 让jsonData =试试encoder.encode(person)String(data:jsonData,编码:.utf8)! // {“ name”:“ Brad”,“ age”:53} Voilà,人员价值就这样转换为数据。 现在让我们反序列化 : 让解码器= […]

妈妈,没有情节提要!

作为一名自学成才的iOS开发人员,他通过观看Youtube教程和使用故事板的在线课程来学习大多数技能,这已成为第二自然。 一段时间以来,我什至都不知道在Xcode中使用情节提要还有其他选择。 我错了! 在学习Swift的过程中,我开始看到许多项目在其项目中使用了程序约束。 因此,我开始研究为什么人们甚至想使用自动布局DSL。 我的意思是情节提要能够正常工作,但我没有看到任何瑕疵(这就是我的想法)。 基本上,这就是我为什么会放弃情节提要的原因。 协作-故事板无法与源代码控制一起很好地工作。 想要与朋友一起工作时,故事板不是您的朋友。 情节提要很慢-请从开始使用2011 Macbook Air开发的人员那里获取。 我已经习惯了看到彩虹旋转。 🍭 代码大师竞赛—代码将永远是卓越的。 编写,读取和调试更加容易。 这就是我们将要建立的。 它是iPhone X Apple最新和最出色的锁定屏幕的模型。 没有情节提要,也没有笔尖与代码。 那里有许多自动布局的DSL库。 在本教程中,我将使用SnapKit,您可以找到自己喜欢或感觉更自然的风格。 删除Main.storyboard文件。 是的,删除! 在执行此操作时,最好也删除ViewController.swift 。 ( 不要删除launchscreen.storyboard ) 在您的项目中为我们项目中的某些组织创建以下组结构。 将AppDelegate.swift , LaunchScreen.storyboard和Info.plist移到“ 应用程序”组中。 在Controller组内部,创建一个新的viewController类,并将其命名为“ LockScreenVC ”。 在“ 助手”组中创建一个快捷文件,并将其命名为“ 主题 ”。 您现在应该具有以下结构。 我们将使用Pod安装SnapKit。 将以下pod添加到您的podfile中。 pod’SnapKit’,:git =>’https://github.com/SnapKit/SnapKit.git’,:branch =>’swift-4′ pod’SwiftIcons’,’〜> 1.5.1′ 我们将使用SnapKit的Swift 4分支。 Swift Icons是可选的,您不必包含它。 我只是将其用作图标。 […]