Tag: uikit

UIKit:具有卡片样式单元格的TableView

今天,我们将学习如何将每个单元格作为Card(圆角和阴影)制作一个UITableView。 这是最终结果: 好吧,让我们用一个原型单元设置一个表格视图。 为了获得类似于卡片的单元格,我们需要在单元格的“ 内容视图”中使用一个以上的视图,以充当所有单元格内容的容器,并在其中应用圆角和阴影。 因此,视图层次结构应如下所示: 如您所见,我在原型单元cardCell的Content View下添加了一个名为Container View的视图 。 然后,我创建UITableViewCell的子类,其中包含单元格内容的出口,在其中执行以下操作: @IBOutlet 弱var containerView:UIView! { didSet { //使其像卡片一样 containerView.layer.cornerRadius = 10 containerView.layer.shadowOpacity = 1 containerView.layer.shadowRadius = 2 containerView.layer.shadowColor = UIColor(named:“ Orange”)?. cgColor containerView.layer.shadowOffset = CGSize(宽度:3,高度:3) containerView.backgroundColor = UIColor(名称:“红色”) } } 好了,谁看过我以前的文章UIKit:Rounded Views和UIKit:View Shadow,这些代码应该很熟悉,无论如何,此代码所做的就是将容器视图的角四舍五入并设置其阴影。 哇,这很简单吗?! 让我们运行代码并查看结果…… 最佳意大利队队长布冯的卡片,即尤文图斯😛,具有与卡片颜色相同的图像视图(队长带),并且不会被裁剪,从而使卡片的右上角看起来像不四舍五入。 让我们使用containerView.layer.masksToBounds = true使图像视图固定在卡片范围内。 再次运行代码,看看是否能解决问题: Mo! 图像被剪裁,阴影也被剪裁。 好了,通过Internet浏览,似乎唯一可行的解​​决方案是在单元格视图层次结构中拥有另一个视图,在该视图上将阴影应用于裁剪其内容的容器视图下,如下所示: 所以这是问题所在:将图层的属性masksToBounds为true时,其所有子图层以及拥有该图层的视图的所有子视图(我认为都是相同的,因为该视图只是图层的代表)会被裁剪,因此解决方案是将阴影放在最上面的视图上 , […]

如何更改披露指示器的颜色

有时我们有一些要求更改UITableView的Disclosure Indicator的颜色。 cell.accessoryType = .disclosureIndicator 不幸的是,Apple没有为此提供任何解决方案,下面是摆脱此问题的简单解决方案:创建自定义UIView。 这将产生以下输出结果, 快乐编码..希望拍手..🙂

CoreData中的值类型

坚持使用CoreValue 是否可以仅使用值类型来实现业务模型对象? 使用CoreData保留它们怎么办? 在这篇文章中,我将研究CoreValue。 一种轻量级框架,旨在为完成此类任务提供支持。 我已经构建了一个小应用程序来对其进行测试。 这是Github中的代码。 使用值类型对对象进行建模。 在我开始谈论CoreValue之前,有两个潜在问题值得一提: 双向关联无法使用值类型完全表示。 我写了 另一篇 关于这个问题的文章。 结构不支持继承。 关联必须是单向的,以便仅使用值类型正确表示。 例如,如果您需要一部电影来了解其导演,而导演则需要了解这部电影。 仅使用结构表示是不可能的。 您可以忍受这些限制并仍然代表模型对象吗? 如果真是这样,那么仅值类型方法可能对您有效。 否则,您需要课程。 核心价值 它是围绕CoreData的轻量级包装框架。 它负责将值类型unboxing到CoreData对象中,以及将CoreData对象unboxing到值类型中。 它还包含简单的抽象,以便于查询,更新,保存和删除 该框架允许您使用结构/枚举,使用它们,然后保存/删除/获取它们。 当需要将它们发送到托管上下文时,它将值转换为托管对象。 反之亦然。 真的很酷的主意。 它是如何工作的? 您定义结构和枚举。 然后,您遵循框架的协议之一,例如CVManagedPersistentStruct 。 基本上,您可以指定如何从NSManagedObject获取值类型的实例。 每次尝试保存值时,框架都会将其转换为NSManagedObject 。 当您尝试从数据库中获取一个对象时,框架将使用objectID来获取托管对象。 然后它将使用您的转换函数来获取值类型实例。 好的,让我们看看当您仅用值类型表示模型对象并尝试通过CoreValue使用CoreData实现持久性时会发生什么。 开始 集成非常容易,可以进行pod安装,导入CoreValue,然后就可以编写代码了。 但是,我确实遇到了一些非常早期的问题。 第一个问题是尝试保留第一个值类型时发生编译错误 。 使用咖喱将数据从NSManagedObject到值类型中: 无法将类型’((NSManagedObjectID ?, String,Director,Genre)-> Movie’的值转换为预期的参数类型’(_)->(_)throws-> _’ 如果尝试尝试curry init与另一个持久值类型连接的类型,则会发生这种情况。 在我的示例中, Movie知道其Director 。 Director是一个持久的CVManagedPersistentStruct,在Movie出现编译错误。 […]

自定义搜索栏颜色

UI设计人员总是对默认元素外观不满意,并试图通过自定义外观控件展示自己的创造力。 作为负责用代码实现设计的人,您可能会为UIKit默认控件的困难和灵活性感到沮丧。 在这里,我想分享一些自定义UISearchBar对象的技巧和片段。 想象一下您的任务是使搜索栏与应用程序的配色方案匹配的情况。 首先,让我们回顾一下最明显的着色选项,并意识到它根本不明显。 searchBar.backgroundColor = UIColor.green 乍一看,它似乎什么也没做,但是,如果您具有良好的色彩感知能力或借助“色度计”工具,您会注意到所需的色彩已与搜索栏的默认灰度混合在一起。 实际上,它可以按预期工作并更改视图的背景色。 但是您只能通过其顶部的半透明条形视图来查看它。 那么,如何更改此障碍并为搜索栏获得纯色背景色? searchBar.barTintColor = UIColor.green 此代码更改了此条形图的颜色,因此不再是问题。 文本字段呢? 颜色没有属性。 您需要像这样创建UISearchBar类扩展: 作为额外的触摸,让我们尝试在上述文本视图中更改光标颜色。 searchBar.tintColor = UIColor.green 那图标呢? 您可以使用以下扩展名访问和自定义放大镜图标: 占位符文本颜色也可以使用类似的代码进行自定义(但具有按键式的价值): 目前为止就这样了。 如果我忘记了一些内容,我将在此处添加有关UISearchBar的更多提示。 使用Swift编写有趣的代码。

一个简单的面向协议的键盘避免解决方案

我想共享一个整齐的即插即用键盘,避免针对iOS的解决方案,而我经常将其加入我的项目。 确保您的视图不会被键盘遮盖是iOS开发中的其中一项任务,您不必每次启动项目时都从头解决,如果不需要的话。 这也是我避免引入依赖项的原因,因为实现自己并不会花费太多时间。 诸如TPKeyboardAvoiding类的库在处理和处理边缘案例TPKeyboardAvoiding表现出惊人的效果,但是,如果库中存在错误或它不适用于您的设置,并且您不了解该解决方案的工作原理,那么在使用SOL之前,您几乎都是SOL维护人员可以修复它,或者您可以分叉库并自己修复错误-那时,我认为您也可以自行开发。 每个避免键盘的解决方案都取决于观察即将出现键盘时iOS发送的通知。 这些通知包含有关键盘的大小和位置的信息。 系统可以向您发送的四个通知如下: UIKeyboardWillShowNotification UIKeyboardDidShowNotification UIKeyboardWillHideNotification UIKeyboardDidHideNotification 如果视图在UIScrollView ,那么避免键盘只是调整contentOffset的问题,这样输入视图的框架就不会被键盘遮挡。 这是一个协议,描述了UIViewController为了避免键盘必须知道的所有运动部件。 而已! 当用户在输入之间进行导航时,您要做的就是保持对activeInputViewFrame重置,以使键盘activeInputViewFrame 。 全面披露,我还没有将它作为一种万能解决方案进行测试。 我在一些非常相似的视图层次结构中使用了此方法:您有一个UIScrollView约束到VC的边缘,该边缘具有一些包含UITextField / UITextView子视图。 您可能需要根据设置进行一些调整,但是希望通过在通知处理程序中设置一些断点来跟踪发生了什么问题很容易-这种解决方案的优点是非常简洁。 我希望这可以帮助您解除封锁或教会您一些新东西! 如果您有任何疑问,请随时在以下位置鸣叫我或发表评论。

Swift 4:扩展检查角半径,边框颜色和阴影

强烈建议将其添加到您的项目中。 1.只需创建一个Swift文件并粘贴代码即可。 PS有时您所做的更改有时不会显示在情节提要上。 但是,它仍然方便且简单! 了解有关IBDesignable和IBInspectable的更多信息: Swift 3中的@IBDesignable和@IBInspectable。 IBDesignable和IBInspectable,这是一种创建自定义元素和属性的方法。 这可以直接添加到… medium.com

UIKit安全区域继承:

它真的有效吗? 在2018年的WWDC演讲中,David Duncan指出了适用于各种尺寸和形状的UIKIT应用 ,子视图继承了父视图的安全区域。 因此,当您获得子视图的安全区域插图或其安全区域布局指南时,将看到与父视图的安全区域重叠的安全区域。 还是会吗? 例1 当我创建一个父视图时,然后添加一个带有内部视图的容器视图,这两个视图都有自己的视图控制器,继承就起作用了。 包含的UIView与预期一样,从父视图控制器继承了安全区域,同样,布局指南也是正确的。 这里是链接: misbell / SafeAreaInheritanceWorks 通过在GitHub上创建一个帐户来促进misbell / SafeAreaInheritanceWorks开发。 github.com 例子2 创建父视图时,然后直接在父视图上添加一个子视图,然后在子视图的顶部添加内部带有视图的容器视图,该子视图不会继承安全区域,所包含的视图也不会继承(此处未显示,但未显示。) 子视图的安全区域显然不是从父视图继承的。 难道我做错了什么? 还是按预期工作,我不明白为什么? 这是链接。 misbell / SafeAreaInheritanceNOTWorks 通过在GitHub上创建一个帐户来促进misbell / SafeAreaInheritanceNOTWorks开发。 github.com 后来:.. 我尝试在根视图和包含的视图上都添加动态子视图。 动态添加到根视图的子视图仍未收到传播的安全区域值。 动态添加到所包含视图的子视图确实收到传播的安全区域值。 我猜测何时以及如何传播安全区域值存在问题。 这是动态创建代码的链接: misbell / SafeAreaInheritanceDynamic 通过在GitHub上创建一个帐户来促进misbell / SafeAreaInheritanceDynamic开发。 github.com 思想 因此,如果我在争论这个问题,我会说,看,伙计,没有必要将saef区域插图传播到根视图上的子视图,这些视图没有被嵌入并且没有自己的视图视图控制器,只是普通的旧子视图。 根据定义,您位于根视图控制器中,您知道安全区域在哪里,并且可以对其进行调整,无论是在Storyboard中还是在代码中动态进行调整。 鉴于如果您的嵌入式视图带有其自己的视图控制器,则需要访问父视图的安全区域,而将它们获取给您的唯一方法是通过传播-很好,这很有意义。 令我震惊的是DD在WWDC谈话中的评论,即子视图传播了安全区域插图。 暗示所有子视图都可以得到它们,并且不,不,它们不能,并非在所有情况下都可以。

UISlider

UISlider elementini下摆IBAction下摆IBOutlet olaraktanımlıyoruz。 Demekistediğim; 索鲁:UISlider elementini neden IBOutlet olaraktanımladık吗? 声明:UISlider elementinin“值”由IBOutlet olaraktanımladık提供。 Soru:UISlider elementini neden IBAction olaraktanımladık吗? 使用者:UISlider elementikullanıcıileetkileşimegiren biryapıyasahiptir。 KullanıcınınUISliderüzerindeyaptığıhareketleri almakiçinIBAction olaraktanımladık。 2-UISlider elementininayarlarınagözatalım。 (最小,最大ve值değerleri) UISlider elementinin“显示属性检查器” sekmesiniaçalım。 价值: UISlider ilekarşılaşıcağıilkdeğerdir。 最小值: UISlider元素最小值中的最小值。 最大值: UISlider元素的最大值为deeridir。 最大值,最小值ve值UISlider elementimizikaydırıpdeğeri标签elementindegösterelim。 😉 3-)滑块hareketlerinitanımladığımızUILabel elementindegösterelim。 “\(slider.value)” -BugösterimStringtürünecast etmektir。 String(slider.value — Bugösteriminyukarıdakigösterimilearasındahiçbirfark yoktur。 在基础上😉Anlıkolarak Sliderüzerindekiparmak hareketlerinitanımlamışolduğumuzUILabel elementineaktarıyoruz。 Soru:Sayıyıneden Stringtürünecast ettik吗? […]

UIKit:圆形视图

让我们以简单而又令人沮丧的入门技巧开始这一系列的“快速药丸”,以使视图的角变圆。 这是代码: myView.layer.cornerRadius = 20 myView.layer.masksToBounds = true 如果要使用圆形视图,请在界面构建器中创建一个正方形视图,并将其半径设置为其宽度(或高度🔲)的一半: myView.layer.cornerRadius = myButton.frame.width * 0.5 myView.layer.masksToBounds = true 最后但并非最不重要的一点是,从iOS 11.0+起,您只能舍入某些特定的角: myView.layer.cornerRadius = 20 myView.layer.maskedCorners = [ .layerMaxXMaxYCorner, .layerMinXMaxYCorner ] UIKit中的每个视图都有一个类型为CALayer的属性layer ,该属性layer实际上管理渲染,并且具有您可以设置的自己的视觉属性,例如背景色,边框和阴影。 我通常在didSet属性观察器中设置此属性,以避免通过可视化自定义污染viewDidLoad方法: @IBOutlet弱var myButton:UIButton! { didSet { myButton.layer.cornerRadius = 20 myButton.layer.masksToBounds = true } } 下次我将向您展示如何在视图中添加阴影,现在桌上放着炸鱿鱼等着我waiting Github上的代码 Donald90 /快速药丸 SwiftPills – XCode项目,其中包含有关Medium的Swift Pills系列中介绍的每个概念的示例。 github.com 参考文献 卡拉耶 […]

占位符介绍

在UITextField上设置多个占位符并UITextField设置动画 占位符是一个源远流长的功能强大的概念-易于被用户识别,具有严格,合理的含义,并为开发人员提供了一种提示用户的简便方法。 但是,有时仅拥有一个占位符是不够的。 有时您想向用户展示可以输入的所有内容。 例如,如果您有一个名为“活动标题”的字段,那么您当然可以在其中将“运行”作为占位符。 或者,您可以定义一组占位符,例如“运行中”,“行走”,“行进”,“拳击”,并对它们进行动画处理。 如果认真使用此技术,则可以提供出色的用户体验。 看起来像这样: 占位符库允许您做到这一点。 实际上,它确实非常简单,我鼓励您自己尝试实现类似的东西-它可以很好地介绍迭代器, CATransition和Timer (以前称为NSTimer )。 在本文中,我们将快速浏览API,然后讨论一些体系结构选择和功能。 在开始之前,这里是GitHub上的占位符 : 德雷蒙德/占位符 占位符–🅿️为UITextField定义多个占位符,并对它们的更改进行动画处理 github.com 现在让我们潜入吧! 如何使用 占位符旨在与视图控制器很好地配合使用。 API的核心部分是Placeholders类。 您可以直接创建它: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”]) 这将创建一组三个占位符。 当然,通常您希望“循环”占位符,以便动画永远运行。 或者您想改组您的集合,以使用户不会每次都以相同的顺序看到相同的占位符。 为此,应分别使用.infinite和.shuffled选项,如下所示: let占位符=占位符(占位符:[“正在运行”,“正在行走”,“骑自行车”],选项:[.infinite,.shuffle]) 然后,在viewWillAppear方法中,应将Placeholder实例绑定到UITextField 。 您可以通过调用start方法来做到这一点: placeholders.start(时间间隔:3.0, fireInitial:正确, textField:textField, 动画:.pushTransition(.fromBottom)) ( fireInitial用于立即设置第一个占位符) 基本上就是这样! 现在,您有多个动画占位符。 您可以间隔播放或调整动画以适合您的需求。 如果要创建完全自定义的动画,请查看自述文件。 怎么运行的 总的来说,该解决方案非常简单:它是Timer ,迭代器和CATransition的组合。 数据源是通过AnyIterator提供的,占位符的更改是通过Timer安排的,并使用简单的CATransition执行。 如果您想知道动画的执行方式,则为: 让过渡= CATransition() transition.duration = 0.35 transition.timingFunction = […]