Tag: uikit

气泡,气泡,气泡…

气泡可能意味着愉悦而轻松的沐浴,或者对某人来说只是个不错的杜松子酒。 在Tuenti,当有人说Bubbles时,我们对会话组件进行了重新设计。 该组件对于我们的应用程序非常重要。 我们将所有与其他朋友或其中一些朋友共享的内容放置在此处。 例如,我昨天发送给您的短信,由于找不到您而不得不与您共享的位置或仅仅是我打电话预订餐厅的电话。 为了由用户以容易和愉快的方式消费,必须显示越来越多的内容。 它由我们的出色设计师负责,可以确定没有问题! 他们提出了可以针对各种新内容和现有内容进行扩展的设计,但是工程师始终知道必须在代码中实现的那些工件。 “圆角太多!”,“渲染文字会影响性能……”,“滚动条不会很平滑……” 是的 很多评论,很多投诉,但我们所有人都希望得到最好的方法。 我们在谈论UI,所以让我们看看UIKit。 这是我们基于项目的框架。 从此开始,我们发现了一些严重影响性能的点: 渲染文本很昂贵。 单元格的类型很多,大多数都非常不同,主要是它们的高度。 增加拐角半径可能会使主螺纹过载。 然后,我们问自己: 我们应该在没有XIB / 情节提要的情况下进行绘制吗? 我们不应该使用自动排版并获取每一帧吗? 单元格的高度呢? 由我们计算? UIKit进行了很多更改,但似乎已经得到了很大的改进……恕我直言,UIKit的性能越来越差,我不知道这对某人是否重要。 使用单元格的自动高度,我们可以看到主线程使用率很高,并且该应用程序无法使用。 带有多行的UILabel即使没有电话/ URL检测之类的基本功能,也会影响性能。 似乎我们需要像CoreText这样的低级库。 我们仍然尚未启动该项目,但发现了很多问题…… 我们的项目基于Model-View-Presenter ( MVP )。 M和P已经解决,因此让我们使用“虚拟”视图V和Texture框架进行测试, Texture框架已在我们有趣的HackMeUp中经过PoC测试! 而且还不错🙂 好吧,这是“惊人的”,但是……什么是纹理 ? “纹理是建立在UIKit之上的iOS框架,即使最复杂的用户界面也可以保持平滑和响应。” 噢,但是…… 纹理到底是什么? 基本上, Texture是一个框架,该框架内部使用UIKit来呈现视图的UI,从而优化了后台中的每个计算,这意味着避免使用主线程并失去FPS。 在Texture世界中,每个UI组件都是一个节点。 它们基本上是UI组件的包装。 节点提供了非常相似的接口,因此将其集成是一个优势。 让我们从ASTableNode开始,它将取代我们的UITableView。 我们需要创建ASCellNodes来表示每个内容,而不是UITableViewCell。 ASTableNode可以确定单元节点的高度。 这是否意味着它像带有UITableViewAutomaticDimension的UITableView一样工作 ? 它没有,它做得更好。 此外,它还使用其智能预加载功能来计算背景中的高度。 它适用于三种状态: […]

如何在自己的应用程序中使用iOS工具提示菜单

您可能已经在某些Apple的默认应用程序中或在iOS上编辑文本时看到了此工具提示控件。 该工具提示实际上有一个名称UIMenuController ,并且可以自定义并在您自己的应用程序中使用,尽管该API可能很难理解。 成为FirstResponder() 与应用程序具有源自UIWindow的UIView层次结构类似,它也具有UIResponder链,因为视图本质上是响应者。 为了在自定义视图上使用UIMenuController ,该视图必须首先成为应用程序的第一响应者。 在应用程序中,首先接收多种事件的响应者对象称为第一响应者。 它接收关键事件,动作事件和动作消息等。 这并不需要花哨的东西,但是在处理多个UIResponder子类时,了解响应者的层次结构很重要。 尽管UIView基类继承了UIResponder接口,但它不会自动赋予UIView实例成为第一响应者的能力,这就是为什么您只能在UIView子类上调用.becomeFirstResponder() 。 默认情况下,某些iOS控件(如UITextField可以成为第一响应者,但是对于自定义视图,您需要覆盖canBecomeFirstResponder变量。 现在, ResponsiveView任何实例都可以调用.becomeFirstResponder()并成为其超级窗口的第一个响应者,并且由于UIView基类默认将其UIResponder变量canResignFirstResponder为true,因此我们也可以在ResponsiveView上调用.resignFirstResponder() 。 。 UIMenuController 现在我们有了一个自定义视图,可以将其设置为应用程序的第一响应者,让我们在其上显示一个工具提示! UIMenuController具有一个单例实例,您可以在您的应用程序中使用它来轻松地使用多个视图-这样可确保您不会一次显示多个菜单。 请注意,在显示菜单之前,我们必须指定responsiveView View的框架。 这是因为UIMenuController使用此信息将自身适当地放置在窗口中的适当位置。 默认情况下,菜单将显示在第一响应者上方,其箭头指向下方。 您当然可以通过设置箭头方向,指定与第一响应者不同的帧,甚至为目标矩形计算指定不同的超级视图来自定义此行为。 UIMenuItem 在显示菜单之前,我们想要设置一些选项以使其首先显示在菜单中。 例 这是上面的代码示例。 我更喜欢使用minimumPressDuration为0.3的UIMenuController来触发UIMenuController ,因为它模仿了iOS中的默认行为。 如果您对Twitter @sdrzn有任何疑问或想法,请告诉我!

燃烧时我们会过桥

使用KitBridge为macOS,iOS和tvOS开发应用程序 因此,您想编写适用于iOS,macOS甚至tvOS的应用程序吗? 最近有很多关于Photos.app内部的UXKit.framework的讨论,或者可能是另一个替代框架来弥合AppKit / UIKit的分歧。 尽管这可能尚未实现,但没有什么阻止我们现在改进跨macOS,iOS和tvOS的代码的可移植性。 那么,那是什么一回事呢? 虽然UIKit显然是从开发AppKit的经验中衍生出来的,但对于开发人员来说,创建一个更加现代的框架却没有AppKit的负担是一种绿色的领域。 行李的缺乏使开发工作更加简化,但是有经验的AppKit开发人员会遭受附带损害,他们会发现某些更改难以适应,特别是如果他们需要经常来回移动时。 特别是,有很多支持类可以在UIKit和AppKit之间共享,但不是:NS / UIImage,NS / UIColor,NS / UIBezierPath和基础类NS / UIView。 区别不仅仅在于名称,还在于API缺少一些阻抗匹配,这使得将它们与其他现有框架配对更加容易且易于实现。 困扰水域的桥梁 首先,有一段历史,KitBridge是一个相当新的热点,它是基于QRKit原型中的一些最初构想于今年开始的,该构想使用简单的桥接标头,NSImage类别和#ifdef的战略性使用实现了非常有限的跨平台视图框架。实现中的指令。 该简单的标题和类别使QRKit可以在所有目标平台上提供相同的API。 KitBridge以此为出发点,并在此基础上进行了扩展,以包括更多的类和更多的类别,从而平衡了视图的开发。 使用KitBridge,您始终可以将UIKit API用于任一平台上的桥接类。 在iOS和tvOS上,使用本机方法,而在macOS(通常需要更多CPU和内存)上,这些方法按类别提供。 在某些情况下,UIKit缺乏可信赖的AppKit方法,并且也提供了这些方法。 除了扩展网桥支持的类的数量外,KitBridge还使项目更容易在版本之间共享单个实现文件,至少对于View,App Delegates和Controller而言。 建在桥上 虽然KitBridge并未涵盖所有可能的移植问题(我一直在逐个添加功能,因为我需要为各种应用程序提供功能),但它确实为编写可移植的Views和Controller提供了很多支持,并且已经支持了另外两个框架,这些框架提供了有用的一组视图:CardView.framework和SparkKit.framework。 CardView.framework提供了一个具有单个接口的NS / UITextView子类,用于添加样式化的文本和图形。 CardView最初是从DeskLamp提取的,并已进入OrangeCard和iStumbler。 现在,该框架已经与KitBridge集成在一起,一旦考虑到非UI平台的差异,我将把OrangeCard从macOS引入iOS和tvOS。 SparkKit.framework提供了一组数据可视化工具,它们具有饼图,环形图,条形图,堆栈图,网格图和列式数据视图,这些视图也建在BridgeKit之上。 通过协调NS / UIBezierCurve接口来启用它,以便视图具有相同的绘图代码。 iStumbler的最新版本使用SparkKit绘制Channels和WiPry插件的网格视图,我希望在以后的更新中替换折线图和水平指示器。 剩下的工作 消除应用程序和UI套件之间的差异有助于简化便携式应用程序,但仍有许多工作要做。 随着我在这些框架之上构建的应用程序的发展,我希望KitBridge也将发展。 既然似乎有一些兴趣,我想介绍一下框架,因为我认为它们在将应用程序从macOS移植到iOS(反之亦然)时可以节省时间,我希望您喜欢与他们合作。

我如何使用UIAppearance管理我的应用主题(第1/2部分)

在第一部分中,我将解释动机,方法和定义我使用的对象。 在第二部分中,我将更深入地研究与UIKit API交互的ThemeManager对象及其在应用程序中的使用方式。 最近,我添加了更改应用程序“电视流”主题的可能性,这是最终结果: 为了以一种容易,可维护和可自定义的方式进行操作,我使用了UIKit中的UIAppearance。 该协议具有一些方法,这些方法使您可以更改几个UIKit组件的外观,例如UINavigationBar,UIBarButtonItem等。 此外,您可以对其进行自定义,以便仅当该组件包含在其他组件类型中时更改外观。 由于视图遵循树结构,因此当UIBarButtonItem位于UINavigationBar或UIToolbar内部时,可以选择具有不同的外观。 阅读完Apple文档后,我发现Ray Wenderlich的教程和Abhimuralidharan的教程很有用。 我还以Siesta示例应用程序中的代码为起点。 我使用以下对象来管理主题: ThemeName (枚举):以独特的方式列出所有可能的主题; 主题 (协议):定义定义主题所需的所有属性; LightTheme,DarkTheme,BlackTheme (结构):符合主题协议并实现主题变体; ThemeRepository (协议):摘要如何加载和保存主题; DefaultsThemeRepository (类):使用标准的UserDefaults保存和加载主题; ThemeManager (类):返回当前主题并应用不同的主题,使用存储库检索当前主题并保存所应用的主题;

斯威夫特UIKit’iKeşfedelim

斯威夫特yakınzamanda 5yaşınagirecek。 5个iOS版本您可以使用Swift Dilinde,yazılıyor和Obj-C dilinden esergörmüyoruz。 你是不是喜欢我的节目? İsimlerine? Buyazıdasizlere Swift’te yer alan UIKit’itanıtmayaçalışacağım。 UI kelimesininaçılımı“用户界面”目录。 Yanikişiningördüğüekran diyebiliriz。 Biruygulamayıaçtığınızda塔布拉尔语,butonlar ve metinlergöreceksiniz。 Bunlarınhepsi UIKitadıaltındabulunan objelerdir。 Gördüğünüzüzerebir Ekranüzerindebirkaç元素mevcut。 UILabel ,它的名称为objedir。 Genelliklekısametinlerin,说“ılarınekranayazdırılmasındakullanılanbir obje olmakla birlikteüzerindedeğişiklikleryapmak epeykolaydır”。 Bununla birliktebüyük植骨iText UITextViewkullanmaktayız ,从yarayan pekçoközellikbulunmaktadır。 重要信息“可滚动”的gibiyukarıkaydırarakkalanıokuyabildiğimiz。 像是从Bize birşeyyazmasınıbekliyor isek o zamanUITextField’ıkullanıyoruz。 Küçükgörünebilirancakburayıözelleştirerek她的seyeikullanıcıdanalmanızmümkün。 İsterbir kelime olsun,isterseniz bir paragraf,isterseniz bir toplamaişlemi。 她的türlümetni seve sevealıyor。 İşinizbittiğinde她的zaman […]

扩展UIActivityViewController

我的每日自拍应用程序Close-up一直是一种私人写真日记,但是我一直想为用户选择共享时提供丰富的共享选项。 UIActivityViewController显然是最好的选择,但是早在2015年,我想针对其中出现的现有应用程序自定义一些操作,以提供更好的体验。 因此,我编写了一个名为TJActivityViewController的UIActivityViewController子类,使您可以轻松地通过以下方法覆盖操作 覆盖特定操作或将正则表达式与块匹配的操作。 覆盖用于特定操作的项目。 当我今年早些时候写《 Burst》时,这个确切的组件非常方便再次共享。 因为我发现它是如此有用,所以今天我开放源TJActivityViewController供其他人使用! 我希望它可以使其他人使用UIActivityViewController代替自定义共享菜单,或者增强使用标准iOS共享表的体验。 它可以在GitHub上获得 ! 使用TJActivityViewController覆盖活动非常简单 [activityViewController overlayActivityType:/ *活动类型字符串* / withBlock:^ { //您的自定义替代。 }]; 您还可以使用以下方法自定义返回到活动的项目 [activityViewController overlayItemForActivityType:/ *活动类型字符串* / withBlock:^ id { / *通过活动共享的对象* /; }]; 我目前在我的应用中使用TJActivityViewController来 增强与Instagram,Snapchat,Facebook和Messenger的共享。 当人们通过电子邮件共享时,使用MFMailComposeViewController发送丰富的HTML电子邮件。 将创可贴放在与Twitter,Tumblr和iMessage共享的GIF上,在某些情况下,它们会将动画GIF视为静止图像。 当用户选择保存到设备时,将照片保存到专用于应用程序的专用相册中。 希望您也觉得它有用!

iOS开发课程:界面构建器,情节提要和基本UI类

什么是IB? 如何建立使用者介面? 有哪些基本的UI元素可用? 如何建立自定义UI? 如何使用某些视图控制器构建故事? 让我们在快速指南中回答这些问题! 创建一个新的Single View App项目。 热键:shift + Command + N 什么是IB? Xcode中的Interface Builder编辑器使无需编写任何代码即可轻松设计完整的用户界面。 只需将窗口,按钮,文本字段和其他对象拖放到设计画布上,即可创建可运行的用户界面。 苹果 好的,现在我们有了一个新项目,该项目具有默认文件集和IB定义。 让我们继续。 转到项目导航器并打开Main.storyboard文件。 故事板是iOS应用程序用户界面的直观表示,显示内容的屏幕以及这些屏幕之间的连接。 故事板由一系列场景组成,每个场景代表一个视图控制器及其视图。 场景由segue对象连接,这些对象代表两个视图控制器之间的过渡。 大。 现在我们在Interface Builder上。 好。 我们可以做些什么? 现在,我们将逐步发现每个步骤。 如何在视图中添加新元素? 只需按: Shift + Command + L 选择所需的元素并将其拖动到viewController。 凉。 您的第一个视图已出现。 查看throw Attributes Inspector(在右侧)。 这是UIView属性。 *它是为每个其他UI类元素设置的唯一属性。 好的,让我们将视图与我们的课程联系起来。 显示助理编辑 选择自动模式以显示IB上显示的班级代码 在“属性”检查器中打开“连接编辑器”选项卡(在最后一次点击的右侧) 选择引荐出口并将其拖动到类中 打印IB出口名称 因此,现在我们在代码中很少引用该视图。 打开ViewController.swift并编写代码以更改contentView背景颜色。 结果,在故事板上有第二个ViewController。 […]

关于开发人员macOS Mojave的5件事

苹果刚刚宣布了面向开发人员的即将发布的名为Mojave的macOS更新(版本10.14)。 最终发布日期可能是9月或10月,这已经在科技界引起了轰动。 这可能会影响已经存在macOS应用程序的5种方法: 64位计算机已经存在至少10年了。 但是,许多较旧的应用程序仍然仅支持32位。 这意味着macOS必须同时支持32位和64位应用程序。 苹果已经宣布, Mojave将成为支持32位的最终操作系统。 通过Mojave针对开发人员的这一更改, 您有一年的准备时间并为10.15(适用于Apple的第一个64位操作系统) 更新其构建 。 否则,您的旧版32位应用程序将在2019年秋季不再运行。 macOS Mojave现在要求您的应用在使用摄像头,麦克风或任何自动化设备 (例如AppleScript和Apple Events)时请求权限。 这意味着,如果您的应用程序使用这些功能中的任何功能,则需要更新代码以请求这些权限,并在未授予权限时进行处理。 深色模式是更改UI以便在深色主题上使用更亮的功能 。 开发人员喜欢它,并且只要考虑到这一点构建应用程序,它就看起来很漂亮。 若要发挥优势,开发人员可以查看 有关如何支持暗模式的 Apple文档 。 对于网站,请确保您的背景颜色设置正确,并及时更新您可以添加到样式中的可能查询,以使其在黑暗模式下保持良好外观。 使用Mojave,Safari用户将必须开始明确地授予某些网站跟踪它们的权限。 如果您运行的网站使用任何形式的跟踪或像素定位,请注意这些更改。 您可能需要调整跟踪网站用户交互的方式。 股票应用在Mojave上使用“小杏仁饼”的示例 UIKit是用于开发iPhone和iPad应用程序的用户界面的框架。 有传言说“ Marzipan”是将UIKit引入Mac的桥梁。 在针对iOS开发人员的macOS开发文章中,我们推测了“ Marzipan”的含义。 好吧,今年他们宣布将把它带给Mac开发人员……可能在明年。 他们还为我们在Mojave中提供了预览,其中包括Home,Stocks,News和Calculator等应用。 虽然我们可以看到生成的应用程序,但仍然存在许多问题,例如: 这些应用的外观如何? 该框架使用起来有多容易? 同时构建Mac App和iOS App是否容易? 对于那些现在正在构建macOS Apps的人,这意味着有时间通过​​以下方式准备您的应用程序: 确保您正在组织代码以使用较新的API和方法 避免过时的代码和API 正确使用可在Apple平台上使用的其他框架和API,例如CoreData,Metal,CoreML等。 借助Mojave中面向开发人员的所有新功能,Apple首次为我们提供了路线图。 这意味着我们有时间到2019年第四季度: 更新macOS应用程序以仅使用64位 在用户界面中支持黑暗模式 支持增强的应用程序权限 (相机,麦克风等) 清理您的体系结构以正确使用跨平台框架和API。 […]

Каждому视图повсплывающемуменю

Всегдаприятно,когдавприложениипродуманымелочи。 Однимизтакихнебаловажныхэлементовинтерфейсаявляетсявсплывающееменю UIMenuController中的UIMenuController 。 Вэтойстатьемыразберемся,какработатьсовсплывающимменю,скакимиограниченияеиин Собираемэлементыменю Итак,мысобираемсяпоказатьвсплывающиеменюдлянекоторогоUIView。 Дляначалаопределимся,какиеименноэлементыбудетпредлагатьнашеменюпользователю。 UIItemView 。 Черезнеговконтроллерменюпередаетсяотображаемыйтекстидействие,происходящеепривабе let item = UIMenuItem(title:“ Send”,action: #selector (sendTapped)) Рассмотримпоподробнеевторойпараметр— action 。 Окей,этоселекторнекоторогометода,которыйбудетвызванпривыбореэлементаменю。 Значит,этотметоддолженбытьгде-тореализован,ногдеименно? Еслибыэтобылаобычнаякнопка,тополучателяможноуказатьвметодеaddTarget: sendButton.addTraget( self ,action: #selector (sendTapped),for:…) 在UIMenuItem上添加UIMenuItem 。 Кудажетогдаотправится action ? Обратимсякдокументации: 未指定目标; 通过响应者链的正常遍历找到合适的目标。 响应链 ? Похоже,преждечемдвигатьсядальше,нампридетсянемногоразобратьсявпроцессеобработиисобы。 响应者链иfirstResponder UIResponder ,UIUI应用程序,UI控制器中的Любоеприложениеможнопредставитьввидеиерархииобъектовкласса Каждыйтакойобъектспособенполучатьсобытия:нажатия, 运动 -событияили UIControlEvents ,илибообрабатыватьполученноесобытие,либопередаватьегоследующему 应答 “увиерархии。 响应者 Но,преждечемпопасть,событиедолжнобытьполученокем-товпервуюочередь。 ПоэтомудлякаждоговприложениисобытияUIKitопределяетнаиболееподходящийобъектклас firstfirstResponder’омтотобъектстановится 响应者, […]

使用Swift在iOS中实现登录/注册功能

本文适用于刚刚开始快速开发ios应用程序的用户。 最大程度的初学者友好内容使用情节提要用于此类事情,因此我决定创建一些没有情节提要的内容。 让我们开始吧。 打开Xcode,选择File-> New-> Project。 构建并运行后,您应该看到模拟器以白色视图启动。 现在选择情节提要,您将看到一个白色的场景/视图,选择它并单击删除。 另外,删除ViewController.swift文件。 我们将从头开始。 现在,如果您运行该项目,您将看到一个空白屏幕。 如果您看到该日志,则会发现以下消息: 无法实例化UIMainStoryboardFile’Main’的默认视图控制器-可能未设置指定的入口点? 这是说该项目当前没有任何入口点。 很快,我们将提供一个控制器类作为该应用程序的入口点。 选择文件->新建->文件。 您将看到一个可用模板的窗口。 选择“快速文件”。 它将询问您文件的名称。 给SignUpController,最后按Enter。 选择SignUpController.swift文件,删除所有内容并复制粘贴以下代码。 我们要添加一个橙色视图作为200点的顶视图。 我们如何实现这一目标? 让我们为此创建一个橙色视图。 将以下代码放在viewDidLoad方法上方。 在这里,我们看到表单已经准备好了。 至此,视图部分已完成。 不幸的是,它不响应任何用户操作。 为了启用该功能,我们将以下代码添加到signUpButton: 我们以两种不同的方式为我们的注册表单提供了空文本字段验证。 现在,您可以随意进行一些复杂的验证。