Tag: swift

创建一个自定义UISlider

介绍 这篇博客文章描述了自定义UISlider的创建,该UISlider具有默认滑块的一些附加功能。 我们将使用的类是UISlider,它是UIKit的一部分。 它是一种视觉控件,用于从连续的值范围中选择一个值。 先决条件 首先,我们需要已经对面向对象的概念有所了解,并且需要了解Objective-C语言。 硬件:我们需要有一台Mac,这是iOS开发的基本要求。 软件:要开始开发iPhone和iPad应用程序,Xcode是我们唯一需要的工具。 Xcode是Apple提供的集成开发环境(IDE),它提供了我们启动应用程序开发所需的一切。 默认UISlider的概述: UISlider由各种元素组成,例如轨道 -它为我们提供了一系列可供选择的值, 拇指 -这是一个旋钮,可帮助我们在轨道上滑动所需的值。 移动滑块的拇指时,会将其更新后的值传递给附加的任何操作。 滑块的外观是可配置的; 您可以为轨迹和拇指着色,并提供要显示在滑块末端的图像(minimumValueImage和maximumValueImage)。 您可以通过编程方式或使用Interface Builder将滑块添加到界面中。 让我们从创建演示项目开始。 1.创建一个新的Xcode 8项目 我们将为演示目的创建一个Single View应用程序 。 2.将UISlider添加到视图 在此演示中,我们将使用情节提要将UISlider添加到视图中。 将UISlider拖到Main.Storyboard文件中的视图上,并将元素附加到IBOutlets和IBActions。 从属性检查器中,我们可以根据需要提供MinimumValueImage,MaximunValueImage,MinimunTrackColor,MaximumTrackColor,Slider最小值和最大值等。 默认的UISlider几乎没有功能,例如刻度或工具提示,它们通过移动滑块来显示用户刚刚设置的滑块的值。 因此,我们将构建自定义的UISlider。 3.建立一个自定义的UISlider子类 在Main.storyboard文件中,转到UISlider,然后在身份检查器中将自定义类命名为CustomSlider。 4.添加刻度到滑块 现在,向滑块添加刻度线,我们将在滑块下方插入一个视图。 设置一个属性noofTicks,以在CustomSlider.h类的滑块中定义所需的刻度数。 在您的CustomSlider.m类中添加以下代码。 此方法将添加一个视图以显示滑块上的刻度。 现在,您只需从ViewController.m类调用此方法即可将刻度功能添加到滑块。 所以您的滑块现在看起来像这样。 现在,刻度线的目的是,每当您滑动到特定值时,旋钮都会捕捉到最近的刻度线。 为了实现相同的功能,我们重写了UISlider子类中的UIControl方法。 4.将工具提示添加到UISlider 我们可以向UISlider添加另一个有用的功能,即ToolTip。 工具提示用于向用户提供反馈,告知他或她通过移动它刚刚设置的值。 为了确定滑块值,无论何时将其更新为新值,我们都必须在UISlider子类实现中重写一些UIControl方法: 在beginTrackingWithTouch中:我们必须检查触摸是否在滑块的旋钮边界内,然后相应地显示工具提示弹出窗口。 我们在工具提示的外观/消失上添加了一些淡入/淡出效果。 这里的工具提示是一个自定义UIView,用于显示滑块值。 5.添加ToolTip UIView子类 我们必须构建一个小的视图来表示滑块值(给它一个外观一样的工具提示)。 为此,我们将使用UIBezierPath创建两个路径:一个是矩形,另一个是连接到它的箭头。 为了提供所需的外观,将两个路径合并在一起,并使用浮点值表示滑块的旋钮位置。 我们可以在子类的drawRect:方法中完成所有这些操作,通过该方法,每次值更改时都可以获取更新的视图。 […]

使用带有Swift的PDFKit向PDF添加签名

去年WWDC17期间,Apple在iOS上引入了PDFKit。 与Adobe PDF 1.7版相比,这有了一个很好的框架,使使用PDF文件格式的工作变得更加容易。 因此,我们创建了一个了不起的框架,该框架为您提供了PDF的功能,而您无需阅读所有这些详细信息。 我们阅读了它,所以您不必一定没事。 使用PDFKit,有3种类型的类别类别-视图,文档和支持。 PDFView将成为我们包含PDFDocument的容器视图。 在文档或PDFDocument上,它将保留页面和注释。 PDF上的注释基本上是页面上的交互式元素。 注释将诸如笔记,声音或电影之类的对象与PDF文档页面上的位置相关联,或提供了一种通过鼠标和键盘与用户进行交互的方式。 借助PDFKit,Apple打包了这些类型以使我们可以访问。 那么,我们如何添加签名? 向PDFPage添加PDFAnnotation,一切正常,对吗? PDFAnnotation具有子类型,因此在特定情况下应使用哪一种。 有两个引人注意的地方:PDFAnnotationSubtype和PDFAnnotationWidgetSubtype。 如果单击它们,您会注意到有一个“签名”注释小部件。 凉! 让我们使用它。 除此以外,没有关于如何使用它的文档,也没有任何示例代码。 (如果您知道,请告诉我!) 在Adobe的PDF规范中(是的,一个苹果公司说我们不必阅读)概述了PDF的不同注释类型。 通过研究,我发现了橡皮图章注释。 橡皮图章注释(PDF 1.3)显示的文本或图形看起来像是在橡皮图章上被盖章的文本。 好吧,让我们做一些我们知道会起作用的事情。 我们为什么不只将签名的UIImage作为图章注释添加到PDF页面! 我们将使用dehili的TouchDraw添加一个视图,该视图将捕获我们签名的笔触。 这个框架有一个很好的方法可以将图形提取到UIImage中,从而从图像上下文中获取笔触。

pod安装有什么作用?

程序pod转到Podfile顶部列出的source 。 如果您不提供source ,则pod默认为https://github.com/CocoaPods/Specs。 Pod遍历与其相依性清单相符的.podspecs的来源 pod’Dependency1′ pod’Dependency2′ pod’Dependency3′ 如果版本不同,它将选择与该版本匹配的podspec,如果找不到,则会抛出错误。 如果未指定版本,则默认为1。 如果列出了多个来源,那么pod会在第一个框架中搜索所需框架的列表,如果找不到任何框架,它将检查列出的下一个框架,依此类推,直到找到所有或没有更多框架为止。剩下的资源来检查Pod安装将在何时失败。 3.到达podspec后,Pod会识别来源。 然后去那里 4.到达源后,它将遍历源,直到找到与名称匹配的项目。 5.一旦找到源文件,它就会通过检查源文件找出要包括哪些文件并将其引入项目。 6.然后检查列出的依赖性。 7. pod然后转到该项目的Podfile,并重复步骤1–7,直到没有其他依赖项可以获取为止。 这是有效与coapapods一起工作所需的最低限度的高级知识。 更多细节 吊舱还访问源位置以获取吊舱的依赖关系… 当项目中有一个podfile并运行pod install 。 程序pod从source变量Podfile指定的Podfile 。 在这些CocoaPod ,程序pod尝试查找.podspecs (忽略其Podfile可能存在或不存在)。 pod读取.podspecs文档,并检查s.dependency值并尝试查找此处列出的依赖项。 它解决了冲突,例如,假设您的Podfile列出了两个依赖项: A和B A依赖于C版本1.1.0 ,而B依赖于C版本1.2.0 。 该程序不会简单地两次安装依赖项C 它选择1.1.0或1.2.0解决依赖项C的冲突版本,并且仅安装一次依赖项C 这是有关Pod安装的有趣文章。 这是我从那篇文章中得到的笔记。 运行Pod安装 阅读Podfile 版本控制和冲突 加载源。 生成pods.xcodeproj 安装库 写作点击 创建Podfile.lock 清单锁 xcproj 少许肺炎:建议 :给予预防 读取Podfile Cocoapods通过加载Podspec来列出显式和隐式定义的Pod,这些Podspecs远程存储在git或本地存储在〜/ cocoapods中 版本和冲突 […]

大规模的Swift —我在2016 Swift Summit中学到的东西

我参加了2016年11月7日至8日在旧金山举行的Swift峰会,该峰会仅针对Swift开发者。该峰会在美术宫剧院举行。 演讲者来自海湾地区的Facebook,LinkedIn,IBM和Uber等大公司。 他们分享了如何在大型软件项目中使用Swift的经验。 我从他们的谈话中学到了很多东西。 苹果公司有一些与会者。 克里斯·拉特纳(Chris Lattner)也参加了会议。 对于Swift而言,大公司要求的第一大功能是缩短编译器时间。 耐心一点! Swift团队正在为此努力。 案例研究:Swift与Uber的约150名工程师 演讲者:Uoma的Tuomas Artman Uber的iOS团队在不到9个月的时间内就使用Swift重写了整个iOS应用程序。 那就是上周发布的新iOS应用Uber。 演讲者分享了他们如何将编译器时间从20分钟减少到6分钟。 他们做了什么: 不要使用类型推断。 编译器不需要查找类型信息本身。 合并文件。 将200个模型文件合并为1个可以将编译时间从1分钟35秒减少到17秒。 在Xcode的调试模型中禁用某些编译器优化。 这些编译器优化可以在针对发行版的继续集成中重新启用。 他们从Airbnb学到了这个技巧。 他们甚至试图使用另一个构建系统-Buck。 这是Facebook开发的快速构建系统。 同样,它是可重用,灵活和可扩展的。 该项目正在进行中。 发言者说,如果Buck按照他们的预期工作,则编译器时间可能为2-3分钟。 他为Swift的新构建系统感到非常兴奋。 Uber的另一个挑战是二进制文件大小。 iOS应用程序的最大大小为100 MB。 似乎他们没有找到一个好的解决方案,只提供了更少的代码。 快速规模化 演讲者:卡米尔·泰勒(Kamilah Taylor),Linkedin LinkedIn是最早使用Swift在生产中开发iOS应用的少数公司之一。 他们还抱怨非常非常长的编译时间。 在15 rMBP上进行冷构建大约需要25分钟。 一个挑战是,由于Swift编译器不稳定,因此构建系统失败了。 随着Swift语言本身的变化,迁移到新版本的Swift通常需要一周的时间。 他们学到的是: 使用Swift并非免费。 投资您的工具和基础架构团队 Swift确实需要更多的开发人员维护时间,而培训和实际编码所需的时间更少。 准备好耐心和幽默。 将Swift的边界推向服务器 演讲者:Chris Bailey,IBM 根据我的观察,IBM是唯一在Linux上使用Swift的公司。 他们将Swift引入了他们的云服务器-Bluemix。 Swift最初没有许多常见的框架,因此它们不得不花很多时间来开发这些框架,包括Https,JSON和异步调度。 发言者提到了为什么在服务器上使用Swift。 […]

缩进Swift代码

缩进只是个人喜好。 最好是遵循团队中使用的约定。 这是我缩进代码的方式。 让我知道你的想法😉 使用2个空格缩进 尽可能将编辑器配置为使用2 spaces作为tab size 。 你会喜欢它的❤️ 将第一个参数移到新行 如果参数很多,请将第一个参数移到新行,然后对齐其他参数。 请记住,最后一个括号)应该与函数调用对齐 let event = NSAppleEventDescriptor( eventClass:UInt32(kASAppleScriptSuite), eventID:UInt32(kASSubroutineEvent), targetDescriptor:目标, returnID:Int16(kAutoGenerateReturnID), transactionID:Int32(kAnyTransactionID) ) 您可以对函数声明执行相同的操作 func collectionView( _ collectionView:UICollectionView, viewForSupplementaryElementOfKind类型:字符串, 在indexPath:IndexPath)-> UICollectionReusableView { //您的代码在这里 } 如果闭包超过2个,则不应使用结尾闭包 这是如何使用UIView.animate UIView.animate( withDuration:5 延误:5 usingSpringWithDamping:1, initialSpringVelocity:1 选项:.curveEaseIn, 动画:{ self.tableView.alpha = 1 }, 完成:{_ self.view.isHidden = true } ) 这是使用RxSwift subscribe […]

适用于iOS的日历日和周视图

寻路器/ WRCalendarView WRCalendarView —适用于iOS的Calendar Day and Week视图 github.com iOS的周/日calenda库和RVCalendarWeekView库。 만지만objective-c로원하는기능가지들이구현되어지않았습니다。 图书馆的快速下载。 新增功能 左右水平无限滚动 在星期和星期之间可以更改 水平分页 屏幕截图 待办事项功能 拖放事件 可捏事件 测试代码

Swift设计模式:观察者模式

今天,我将解释Swift中的观察者模式和实现。 那是什么 真实案例 想象一下,您是一名消防员,在有任何火焰时,他随时准备着紧急电话。 如果有电话从您的便携式对讲机传来,您必须准备好津贴并准备灭火。 定义 因此,观察者模式是一种设计模式,该模式着重于Observable发生更改或其他事件时的对象反应。 从上面的示例中,便捷的对讲机充当可观察对象,以向观察员(消防员)发出通知。 特点 观察者具有满足以下特征的特征: 有一个可观察的 附加和删除可观察物 通知观察者有关更改 代号 因此,该模式包含2个协议, Observable和Observer以及一些符合Observable或Observer协议的具体类或结构。 works 下一步是什么? 我希望您能了解如何在Swift中实现观察者设计模式并了解其工作原理,因为NotificationCenter或KVO机制是建立在观察者模式之上的。 如果有无法理解的事情,请在评论中让我知道。 干杯。

在Swift 3中使用NSNotificationCenter

在iOS开发过程中的某个时刻,两个实体将不可避免地需要发送和接收信息,而作为开发人员,则由您自己决定如何做。 在本文中,我们将介绍使用NotificationCenter发送信息。 NotificationCenter并不像名称所暗示的那样用于将通知发送到用户的电话,而是使您的代码能够根据特定情况发送和接收警报。 在许多软件开发中,有不止一种工具可以解决问题,因此有多种工具可供选择。 如果希望事件在代码的某一部分(例如,View Controller)中发生事件,以在代码中的其他地方触发某些事件,则可以使用通知。 这类似于通过利用Swift协议向委托传递信息。 当一个动作被触发时,另一个对象(希望)正在监听该事件,并且当它们接收到被触发的消息时,将采取进一步的动作。 使用委托,您可以传递可以由委托所遵循的协议中的功能操纵的特定信息。 这允许单独的对象传递回或传递信息以便进行操作。 。 如果您希望代码的一部分对其他代码大声喊叫,则通知非常有用。 如果您收到我的来信,请执行一些操作! 那是什么,这取决于你!” 在此示例中,我将在选项卡栏控制器的第二个选项卡中设置“通知”观察器。 在SecondViewController的viewDidLoad内部,我将初始化一个Notification观察器,该侦听器将侦听FirstViewController中被点击的按钮。 当按下该按钮时,SecondViewController将更改其背景颜色。 这就是实际情况。 请注意,我首先切换选项卡,然后转到SecondViewController,屏幕为黄色。 这是我将视图控制器设置为的初始颜色,但它也说明了重要的一点。 我将NotificationCenter观察器放在SecondViewController的viewDidLoad中。 因此,需要初始化SecondViewController,以便可以调用viewDidLoad,随后观察者可以开始侦听。 在您的应用程序中设置Notifications时要意识到这一事实,这可能是任何人都未听到Notification帖子的原因。 代码 通知要求将名称附加到通知帖子或通知观察者。 名称就像关键字,可以帮助标识观察者应该收听的Notification帖子。 您的代码中可能有两个不同的通知,它们执行两项非常不同的操作。 能够唯一地命名此项目,使您能够确定要发布的通知和正在监听的通知。 如果我意识到需要在我的所有应用程序中进行更改,那么我已经开始习惯于使用扩展来减少代码的重复性,并使代码更易于操作。 我在Notification.Name上使用扩展名,因此我可以轻松访问在代码中使用的所有唯一名称(将它们视为每个Notification的唯一代码)。 扩展名的值为“ tabvc”,因此Notification.Name现在可以访问tabVC属性并传递“ tabvc”名称。 这就是在这个简单应用程序中FirstViewController的外观。 我们有一个按钮和我们的viewDidLoad。 在此示例中,我们的viewDidLoad只是将颜色更改为更可识别,并且当我们按下按钮时,我们发布了Notification。 现在我们已经发布了Notification,现在可以设置观察者以在触发changeColorButtonPressed后执行我们想要的操作,因此可以发布Notification。 这就是我们的SecondViewController的样子。 在viewDidLoad中,我们将初始背景色设置为黄色,并且还设置了NotificationCenter观察器。 我们使用先前在Notification.Name上进行的扩展名传递名称,这与发布Notification时使用的扩展名相同。 您可以将其视为收音机,观察者正在将其调整为与帖子发出的频率相同。 然后,我们设置一个选择器,以在观察者检测到发布的帖子在应用程序中的任何位置具有相同名称时,调用changeBackgroundColor函数。 一旦发生这种情况,SecondViewController的背景颜色就会更改。 在此示例中,我将nil传递给对象变量,但是在您的代码中,您可以传递有关要发布的Notification的特定信息。 如果您发现自己传递了很多信息,则可能需要考虑使用委托,因为可以对委托进行微调以精确地完成您想要的事情,并使他人更容易阅读您的代码以跟踪事件的进展。 感谢Stack Overflow和Apple文档提供的信息。 编码愉快!

UITableViewController将自动调整内容相对于键盘的位置(iOS,Swift)

我如何遇到这个话题 我过去很少使用UITableViewController。 我创建的视图很少是简单的tableViews。 相反,它们包含自定义的页眉,页脚,弹出窗口,按条件排列的按钮等。插入了全尺寸tableview的UITableViewController不符合要求。 添加一个tableview并为UIViewController设置一些委托就足够了。 我不明白的 那么,什么时候应该使用UITableViewController? 我现在如何理解 UITableViewController具有一个有用的特性: 在tableview中选择输入字段(例如textView,textField)时,它将自动调整滚动插入,以便在键盘上方可以看到输入。 我做了什么 这是一个简单的项目: 运行该项目,结果是这样的(对拉伸效果差的gif表示歉意): 那样可爱吗? UIViewController的实现需要 键盘高度 当前位置 响应者职位 从上面计算滚动插图 设置插图 所有这些都由UITableViewController隐式处理。 当然,这可以通过使用默认实现定义键盘帮助程序协议来实现,但是如果这看起来太麻烦了,那么查看ContainerViewController + UITableViewController可能会很方便。

迅捷金属乐

适用于iOS和macOS的超快速着色器和管线探索 在过去的几年中,与许多开发人员一样,在Swift Playgrounds中工作时,我对编辑/编译/运行周期的速度不满意。 Swift Playgrounds让我们有机会轻松编写快速代码以测试概念,而无需构建完整的应用程序,部署到设备或模拟器以及观察结果。 我已使用Swift Playgrounds更好地了解了许多技术,包括: 斯威夫特语言概念 核心动画 SpriteKit 场景套件 一个让我难以理解的领域是在Swift Playground的Metal中工作。 Metal是Apple的底层图形系统,旨在利用自己的硬件并提供出色的性能。 我相当怀疑是否有直接在Metal中工作的实际输出-SceneKit对我来说做得很好-但我仍然感到需要挠痒痒。 因此,另一个游乐场冒险开始了。 配置游乐场 在创建用于Metal开发的游乐场时,需要将其设置为macOS游乐场。 iOS操场不符合条件,因为模拟器无法提供我们进行Metal开发所需的直接GPU访问。 我们需要导入一些框架。 为了处理我们的macOS视图,我们需要访问Cocoa。 我们需要Metal才能与Metal合作。 最后,我们需要PlaygroundSupport才能显示Metal视图。