Tag: uikit

UIGestureRecognizer:теория,практика,кастомизация

ПредставляяпервыйiPhone于2007年年初发行,СтивДжобсапеллировалкустареваниюконцепциифизическойклавиатуру Сэтогомоментанаразвитиеустройствскачественнымитачскринами,позоои Теперьпалец – главныйинструментуправлениядевайсомимыможемтапатьпокнопкам,свайпатьсписки,пинчитьфотографии…Давайтеразберемсякакэтореализованососторонысофтаинаучимсяиспользоватьвсюмощьмеханизмараспознаванияжестов。 UITouchиегообработка Нодавайтепопорядку。 Передтем,какначинатьраспознаватьжесты,надопонять,каквообщеприложениеполучаетинформациюокасаниях,свайпах,нажатияхнаэкраниктоихобрабатывает。 Чтопроисходит,когдапалецпользователякасаетсяэкрана? Системасоздаетобъекттипаевоетере Этозначит,чтонавремявсейцепочкисобытий “палецкоснулсяэкрана→палецдвижетсяпоэкрану→палецоторвалсяотэкрана” длякаждогопальца,касающегосяэкрана,существуетуникальныйобъектUITouch。 Далее,используямеханизм命中测试’,находитсясамаяглубокаявиирархииUIView,框架которойсодержиевсеб ПолученнаяUIViewстановитсяfirstResponder ,使用UITouchипрокидыватьихдальшепоresponseerChain 。 Дляобработкипоступающихсобытий,UIViewпредоставляетнесколькометодов: touchesBegan(_ touches:设置,并带有事件:UIEvent?) —началокасания(экранакоснулисьпальцы) touchesMoved(_ touches:Set ,事件:UIEvent?) —изменениепараметровкасания(позициянаэкране,сила(ForceTouch)) touchesEnded(_ touches:设置,带有事件:UIEvent?) —конецкасания(пальцыбылиубранысэкрана) touchesCancelled(_ touches:Set ,事件:UIEvent?) —отменакасания(далеерассмотрим,чтоэтозначит) ТаккакэкранiPhoneподдерживаетмультитач,товодинмоментвремениможетизменитьсясостояниесразу Например,еслипользователькоснетсяэкранадвумяпальцамиодновременно,системавызоветtouchesBegan лишьодинраз,новомножестве 设置 мыполучимдваобъекта—图库矢量图片。 Первыетриметода( 的touchesBegan,touchesMoved,touchesEnded)отвечаютза“нормальный”жизненныйциклUITouchивызываютсяприначалекасания,измененииегопараметров(позициянаэкране,силанажатия)иконцекасаниясоответсвенно。 Однако, 触摸 выбиваетсяизихряда已取消。 Насамомделе,концомжизненногоциклаUITouchможетбытьнетолькофизическийконецжеста,ноикакое-либопрограммноесобытие,вследствиекоторогосистемабудетвынужденапрерватьобработку данногокасания 。 Этоможетпроизойти,например,вслучае,еслипоявилсяинтерфейсвходящегозвонкаипродолжениеобработкикасаниябудетнекорректным – пользовательуженаходитсявконтекстедругогоприложения(телефон)。 Ожидается,чтоприполученииtouches已取消 приложениеотменитвседействиякоторыемоглибытьпротевреивведен。 Дляпониманиялогикиэтоготребованиярассмотримкнопку。 Пустьпользовательнажалнанее,ноещенеподнялпалецивэтовремяпроисходитвходящийзвонок。 ЕслиобработатьtouchesCancelledаналогичноtouchesEndedивызватьобработчикнажатиякнопки,топослеокончаниязвонкаивозвратавприложение будетпроизведенокакое -тодействие,котороепользовательмогнеожидать。 […]

UIPageControl

Merhaba TurkishKit,可以轻松地将UIKit添加到UIPageControl中。 UIPageControl和其他UIScrollView元素可分为两个类别。 迅捷的UIKit UIScrollView Ekranlarınfizikselboyutlarınasığmayan,sınırlarıortadankaldıranuygulamar yaratmakistiyorsanız,UIScrollView ile… medium.com Vakit kaybetmedenbaşlayalım👍 UIPageControl Nedir? UIKit的UIKitControl,UIScrollView的UIKit控件和UIScrollView的UIKit控件。 UIPageControl NeredeKullanılır? Genellikle UIScrollView可以使用UIPageControl,还可以使用uktay的控件。 ÖrneğinInstagram,照片在页面上,UIPageControl元素在页面上。 在Instagram页面上发布UIPageControl elementidir。 UIPageControlKullanımı UIPageControl,添加了6个图标。 下议院说,在下议院,下议院说在德国,在德国,在德国。 YönlendirmeleriKontrolEdebileceğimizDeğişkenler Sayfadaki ElementleriGüncellemekİçinKullanabileceğimizDeğişkenler YenidenBoyutlandırmayıKontrol EtmekİçinKullanılabilecekFonksiyon UIPageControl的创建和更新,请执行以下操作。 KodlamaZamanı! UIPageControl和UILabel的UILabel元素。 主题1 —界面生成器YardımıİleElementlerimizi故事板DosyamızaEklemek 在Main.storyboard界面中的界面生成器中,可以使用UIPageControl和UILabel元素。 附件2 — Elementlerimizi ViewController用户手册İçerisineTanımlamak 可能会出现其他问题,例如,Elementlerimizüzerindedeğişiklikleryapabilmemiziçin,Elementlerimizi ViewControllerdosyamıziçerisineeklememiz gerek。 Bunuyapmanınen pratik yolu,ekranısağüstkısımdaki2.butonunyardımıile ikiyebölerek,elementimizinüzerinecontroltuşunabasılıtutaraköbürsayfayasürüklemektir。 主题3 — Arkaplan RenginiDeğiştirmekİçinGerekli Fonksiyonu Yazmak Buuygulamamızda,UIPageControl元素,zigıkınarkaplan renginideğiştirmek和bir fonksiyonoluşturmamızgerekli。 […]

将TVML和UIKit组合为Apple TV

如许多iOS开发人员所知,UIKit提供了强大的API,可创建可自定义的交互式应用程序。 当来自iOS背景时,使用UIKit创建您的AppleTV应用程序似乎不费吹灰之力… 但是,TVML模板是一个非常有用的工具,可以简化UI并显着减少开发时间。 让我们看一些好处: TVML模板为用户提供了熟悉的体验。 您是否注意到许多AppleTV应用程序具有类似的浏览,预览,搜索,播放等方式? 这是因为它们中的许多人都使用TVML模板,这些模板对他们而言具有独特的外观。 这大大减少了设计时间。 即使很少的JavaScript经验,模板也非常易于实现。 自动版式会为您处理。 延迟加载图像会自动发生。 苹果已经解决了屏幕上每个UI元素的行为。 模板结构化且可自定义。 模板是即插即用的,但是您仍然可以自定义UI元素的某些方面样式和属性 您可以在网络服务器上托管TVML / TVJS文件。 这使您可以对应用程序进行更改,而无需用户将更新下载到应用程序。 这意味着您无需等待3天即可让Apple批准您的UI更改! 那么,如何选择使用UIKit或TVML开发tvOS应用程序呢? 好消息-您不必! UIKit和TVML模板可以在同一项目中混合在一起 。 这意味着您可以利用UIKit自定义功能,而无需为TVML自动提供的一切重新设计轮子! 在这篇文章中,我将演示如何完成两个框架的结合。 首先在Xcode中创建一个新的TVML App项目,或者打开现有项目。 确保托管application.js文件进行测试,以便显示TVML模板。 要创建用于测试的本地服务器,请在终端应用程序的项目文件夹中使用以下命令: python -m SimpleHTTPServer 9001 显示TVML模板要求您使用控制JavaScript上下文的对象: TVApplicationController 。 创建新项目时,将在AppDelegate.swift中为您创建该对象。 将UIViewController添加到堆栈堆栈很容易: 这使您可以将自定义UIViewController推入导航堆栈。 如果要返回,只需像往常一样将viewController从导航堆栈中弹出即可。 现在我们可以在项目中同时显示TVML模板和自定义UIViewControllers,现在该学习如何在两个世界之间进行通信了。 我们可以从Swift代码库中调用托管JavaScript代码库中的方法。 为此,我们创建了一个方法,该方法告诉我们appController中的JavaScript上下文我们想调用JavaScript方法。 这是一个例子: 此示例假设我们的JavaScript代码库中有一个名为pushAlert()的方法 。 在Swift中调用pushAlertJS()将在我们的JavaScript代码库中调用pushAlert()方法(也许您可以在application.js中创建pushAlert()作为测试)。 这意味着您可以在用户按下UIViewController上的按钮后显示TVML模板。 很酷 有时,当用户与TVML模板进行交互时,您可能想在Swift中调用方法。 为此,我们需要向JavaScript上下文中注入一些自定义的Swift代码。 这是一个例子: createSwiftPrint()将代码注入JavaScript上下文; 因此,需要在运行JavaScript代码之前调用它。 确保在应用程序安装过程中调用这些注入方法。 […]

UITextField

Merhaba土耳其语Kitokuyucuları,UIKit serisi ilekarşınızdayız! Bugünkükonumuz UITextField。 Vakit kaybetmedenbaşlayalım😉 Öneri! 请按一下UIButton和UILabel,然后再单击Linklerden bilgi alabilirsiniz。 🤗 UILabel UIButton UITextField Nedir吗? UITextFieldkullanıcıileetkileşimegiren ve genelliklekullanıcınınbir metin girmesiiçinkullanılanUI elementidir。 巴尼尔(GenelBakış) UITextField sadecekullanıcınınmetin girmesiiçinkullanılmaz。 İsterisindebir metin degösterilebilir。 UITextField elementinin文本区域,游标区域背景和背景区域。 UITextField elementini kod veya接口生成器aracılığıylaekleyebilirsiniz。 库兰尼姆·阿兰拉里 Kullanıcıileetkileşimliolan bir uygulamadaçoğuzamankullanıcıadı,soyadı,şifre,yaş,telefonnumarasıgibi birçokbilgikullanıcıdanistenir。 请参见UITextField元素。 UITextFieldYapısı 光标: Yazıalanındakidikey inceçizgidir。 Klavyeden girilen bilginin etkiedeceğiyerigösterenarayüzelemanıdır。 占位符:在UITextField elementin中,请参见UITextField elementin中的内容。 Girşmişbir uygulamayaptığımızdabirden fazla […]

委托Swift

在讨论委托时,我经常看到与通知,观察和回调(关闭或阻止)的比较。 解决许多常见问题时,这些概念有所不同。 本文介绍了委派概念,如何实现适当的委派,最佳实践,并将委派模式与其他方法进行了比较。 我更喜欢将委托作为“四人帮”一书中描述的概念与可可/可可接触中的委托模式分开。 委托概念 委托(动词)-委托(任务或责任)给另一个人。 新牛津美国词典 在编程术语中,该引用翻译为委托(任务或责任)另一个对象。 委托使用对象组合来允许自定义和代码重用,并且它是继承的替代方法。 委托对象与其委托对象之间的关系类似于子类如何将方法转发给其超类。 突出的区别是继承是静态的,而组合是动态的。 使用委托可以在运行时更改对象的行为。 在这里,我有一个示例对象层次结构。 ShapeView是提供笔触和填充颜色的抽象类。 RectangleView和EllipseView通过重写draw(_:)方法实现绘图逻辑。 在Swift中,在扩展中实现协议很方便。 协议声明 @protocol 委托 < NSObject > 协议 委托 : AnyObject 协议定义了适合特定任务或功能的方法,属性和其他要求的蓝图。 Swift编程语言 协议非常适合委派模式,因为它们可以对需求进行适当的控制,而控制量不超过需求的数量。 这样,委托对象不知道委托的实现细节。 Delegate协议继承了NSObject协议,以便为可选方法提供自省功能。 在Swift中, Delegate声明为仅类协议,以将其用作weak引用。 替代声明使用的是非正式协议,通常是NSObject类别,但是这种方法被认为是旧方法,并且在现代框架中未使用。 属性和内存管理 @property ( nonatomic , weak ) id < 代表 >代表; 弱 var委托: 委托 ? Objective-C中的属性声明为id : id是指向任何对象的指针,委托不限于NSObject子类; Delegate继承了NSObject协议以提供必要的运行时方法。 为了防止强引用循环,将委托属性声明为weak 。 […]

使用iOS 10的新UIViewPropertyAnimator动画约束

在WWDC 2016期间的Session 216中,Apple宣布对UIKit动画进行了相当低估的更新,该更新将标准的UIView.animate(),关键帧动画甚至Facebook的POP框架彻底抛弃了。 它称为UIViewPropertyAnimator ,它允许高度交互和可自定义的动画。 您可以在此处阅读有关此内容的更多信息,并在此处学习基础知识。 在尝试使用UIViewPropertyAnimator并了解适用于其停止和非活动状态的所有不同规则之后,我尝试通过设置约束动画来将事情提升到一个新的水平。 我发现这非常强大,因为您可以使用UIViewPropertyAnimator的.fractionComplete()方法控制动画的进度。 我想在这个交互式汉堡菜单中分享一个约束动画的示例,该菜单受Javi Perez的Nominazer应用程序的启发。 我首先使用UIViewPropertyAnimator的实例,使用平移手势识别器更新.fractionComplete(),将汉堡包中的三行融合为一行。 当用户结束平移手势时,UIView.animate()块会形成一个“ X”。 然后,用户可以使用新的UIViewPropertyAnimator将X的行收敛为一行。 最后,UIView.animate()块用于形成原始的三行汉堡。 如您所见,UIKit的较早的动画方法可以与UIViewPropertyAnimator结合使用,以创建与UI的无缝交互。 您可以在我的GitHub页面上下载此交互式汉堡的代码。 (请注意,上面有很多个人笔记。) 回到当前的主题: 动画约束。 同样,您可以在此处下载该项目的完整源代码。

UIButton

Merhabalar,BugünküyazımdabiröncekiyazıdabaşlamışolduğumSwift ile UIKit serisine devamedeceğiz。 Biröncekiyazıyıokumadıysanızyazıyaaşağıdanulaşabilirsiniz: 迅捷的UIKit UILabel Bugünküyazımile sizlerle yepyeni bir seriyebaşlayacağız。 iOSdünyasındaprojelergeliştirirkenkullandığımızbirçok… medium.com Bugünkükonumuz ise UIButton。 Hazırsanızbaşlayalım🙂 UIButton,可扩展性,可扩展性,可扩展性和可扩展性。 巴尼尔(GenelBakış) 比尔·布顿(Bir buton),《德国人报》(kensinebağlıeylemlerigerçekleşitirir)。 Butonlarıngörünümütamamenözelleştirilebilir。 Arkaplan rengini,yazıfontunu veyabaşlıkrenginideğiştirerekuygulamanızın普通tasarımınauyacak butonlar tasarlayabilirsiniz。 Bir butonuarayüzünüzekod ile veya接口生成器aracılığıylaekleyebilirsiniz。 目标行动tasarımmodelinikullanır。 Bir butonaikifarklıyöntemile aksiyonbağlanabilir; 标签addTarget(_:action:for:) addTarget addTarget(_:action:for:) yöntemiile butonunuza kod ile aksiyonbağlayabilirsiniz IBAction:界面生成器IBAction。 比尔·阿克西永(Bir aksiyon),比尔·丹尼斯·丹尼斯(saine ship)olabilir。 @IBAction函数islemYap() @IBAction func islemYap(发送者:UIButton) @IBAction函数islemYap(发送方:UIButton,forEvent事件:UIEvent) Butonlarıngörünümlerinitanımlayan与farklıdurumvardır。 […]

iOS的UITextView-以及它如何使您的生活更轻松。

在本文中,我们将讨论UITextView a。 具体来说,如何使用UITextViewDelegate处理与特定textView相关的动作。 如果您不熟悉此主题,则可以参考Apple的UITextView文档。 UITextView是iOS UIKit框架的一部分,顾名思义,它处理UI组件以及应用程序的图形和界面组件的布局。 您可能知道iOS应用程序的基本体系结构。 如果不这样做,这是一个偷看。 今天,我们将专注于View部分,特别是UIKit框架中的UITextView 。 UITextView是UIScrollView类的子类,这意味着它继承了其所有功能,这使其具有处理复杂任务的巨大能力,这与其他文本呈现视图(例如UILabel)不同。 从UITextView开始 ,默认情况下是UIView的子类。 因此,继承其所有功能,我们可以向特定的textView添加手势。 为了提供示例,我们现在将编写代码以检测用户在UITextView内对特定作品的轻敲,并获取所按下字符的索引。 该代码将如下所示: 第一步是创建一个UITapGestureRecognizer并将其注册到textView 。 func registerTap(){ let tap = UITapGestureRecognizer(target:self,action:#selector(handleTap))tap.delegate = self textView.isUserInteractionEnabled = true textView.addGestureRecognizer(tap) } 现在我们已经实例化了轻击手势并将其注册到我们在ViewDidLoad()函数中创建的textView中 ,现在我们将继续编写函数handleTap()并在其中执行执行所需功能的逻辑: @objc func handleTap(sender:UITapGestureRecognizer){让sendTextView = sender.view为? UITextView if let textView = sendTextView {let layoutManager = textView.layoutManager // myTextView中的点击位置坐标var location = sender.location(in:sentTextView)location.x-= textView.textContainerInset.left location.y-= […]

调试UIViewAlertForUnsatisfiableConstraints

作为iOS平台上的应用程序开发人员,我经常遇到如下约束警告, 无法同时满足约束条件。 以下列表中至少有一个约束是您不想要的约束。 尝试以下操作: (1)查看每个约束,并尝试找出不期望的约束; (2)查找添加了一个或多个不必要约束的代码并进行修复。 ( “” “, ” “, ” “, ” <“,” “ ”, “ “, ” “ ) 将尝试通过以下方式恢复 打破约束 在UIViewAlertForUnsatisfiableConstraints上创建一个符号断点,以在调试器中捕获该断点。 当我看到此类问题时,我们立即使用UIViewAlertForUnsatisfiableConstraints设置了符号断点。 当我再次运行该应用程序以重现该问题时,Xcode将在上述约束警告处停止。 现在如何处理指针和汇编代码? 经过研究,我找到了一些调试此断点的解决方案。 如果您看到上面的图像,您会看到%rbp,%rsp,%rbx,%r15等字符串。这些属性保存视图和约束的地址,这是约束问题背后的原因。 我们可以在Xcode控制台中打印它们,以查看有关此内容的更多详细信息。 我通常从打印rbx开始,因为根据我的经验,它通常是NSArray ,其中包含该问题涉及的所有视图和约束。 打开Xcode控制台并执行以下命令。 po $ rbx 以上结果看起来与警告消息完全一样,因此,我们可以如何处理它。 三想记住这里, 程序执行在断点处停止 您具有约束问题所涉及的所有视图的内存地址。 LLDB使您可以在运行时评估obj-c表达式 如果查看po $ rbx命令的结果,可以看到view的内存地址。 例如UIView:0x7f94ff5b3c70 我通常会为某些视图提供外观并继续执行程序。 使用从上一个打印命令获得的内存地址,在Xcode控制台中执行以下命令。 ex [(UIView *)0x7f94ff5b3890 setBackgroundColor:[UIColor greenColor]] ex [(UIView […]

使MVC再次出色!

使用泛型,协议和扩展摆脱大型视图控制器 本文的副本也可在此处获得 Model-View-Controller是一种非常常见的软件结构,用于在Apple生态系统中创建应用程序。 尽管MVC是一个简单的概念,但是开发人员经常会错过使用它并将其转换为MVC的想法。 代表“ Massive View Controller”结构。 在这篇文章中,我们将看到如何通过使用一些简单的技术(如泛型,协议,扩展,便捷的初始化程序等)使MVC再次变得出色,让我们开始吧! 我们的应用程序是一个非常简单的应用程序,只有一个屏幕:登录屏幕,用户可以在其中输入其电子邮件和密码,并且该应用程序将在控制台中将其打印出来。 首先,我们将摆脱所有邪恶的源头,情节提要😈 尽管Apple提倡Storyboard作为为其生态系统开发用户界面的标准方法,但Storyboard仍然存在以下主要问题: 性能下降和编译时间。 它们不是git友好的,由于其XML性质,它们使团队工作更加艰苦。 故事板在运行时失败,而不是在编译时失败,这使它们成为大量未知错误和问题的来源。 和更多 … 就个人而言,每次在项目中使用情节提要或Xib文件时,我都会遇到可伸缩性问题。 但是,当我尝试以编程方式编写我的UI代码时,视图控制器变得更大,更难维护,从而无法实现与Massive View Controller对抗的全部目的defeat 1.子类化UIView和UIViewController 2.将所有UI和布局代码从视图控制器中移开。 3.使用扩展来组织视图控制器 4.使用便捷的初始化程序在一行中初始化和设置公共UI元素。 子类化UIView 我们将创建一个名为View的新基类,此子类将从现在开始使用,而不是UIView 类视图:UIView {覆盖init(frame:CGRect){ super.init(frame:框架) setViews() layoutViews() }是否需要初始化?(编码器aDecoder:NSCoder){ super.init(编码器:aDecoder) setViews() layoutViews() } ///在这里设置您的视图及其子视图。 func setViews(){ backgroundColor = .white } ///在此处布置子视图。 func layoutViews(){}} 子类化UIViewController: 与使用View一样,我们将创建另一个名为ViewController的新基类,从现在开始将继承并使用它,而不是UIViewController 类ViewController :UIViewController { 覆盖func loadView(){ 视图= […]