。 。 专业人士提示: 对于iOS中的状态标语,有一些相当不错的第三方解决方案。 如果您使用cocoapods,则可以为此使用多个吊舱。 如果您不熟悉在iOS中使用cocoapods,请参阅此内容。 。 。 我个人使用NotificationBannerSwift。 我们可以利用此程序包的功能以及我们的Helper类,以一种巧妙的方式来显示具有警报样式的通知/状态横幅消息。 首先,我们需要按照自述文件中的说明安装NotificationBannerSwift。 然后,我们需要将其导入到Helper类上方的Helper.swift文件中。 导入NotificationBannerSwift。 .class Helper {静态var应用程序:Helper = {返回Helper()}()。 。 。} 现在,只需在我们之前在Helper类中编写的警报函数之后添加函数showStatus() 。 在执行网络详尽的任务之前,我怎么知道是否有互联网? 如果您在构建iOS应用时曾经问过自己这个问题,那么这是给您的。 苹果有一个方便的SystemConfiguration 该类可以检查网络可达性,更人性化,它可以为您检查是否有互联网,以便您可以检查连接以及在联机时发出请求和进行网络呼叫。 首先,在我们的帮助文件中导入SystemConfiguration类。 导入SystemConfiguration 在到目前为止在Helper类中声明的函数之后,添加以下isInternetAvailable()函数。 就是今天的人们! 在这里查看我的其他文章。
我最近更新了我的一个旧的github项目,该项目大约是四年前我刚开始进行iOS开发时创建的。 这是使用容器视图控制器的示例,特别是我正在研究视图控制器之间的转换。 在该项目中,三个子视图控制器包含在一个视图控制器中,它们周期性地以逆时针方向旋转。 这是一个非常简单且人为设计的视图控制器包含示例,只是为了帮助我了解这种技术的工作方式。 在重新审视视图控制器包含区时,我发现了一些最近的博客文章和会议讨论,内容涉及在iOS中使用容器视图控制器来帮助分离关注点并防止使用大量视图控制器。 像Dave DeLong,John Sundell和Paul Hudson这样的人。 与最初开始开发应用程序相比,这使我想到了最初的实现以及现在如何构建iOS应用程序。 iOS我们一直使用Apple的容器,形式为UINavigationController , UITabBarController , UIPageViewController 和UISplitViewController 。 自iOS 5以来,自定义容器视图控制器就已经存在,并且由Apple实施,部分目的是防止他们认为滥用了应用程序中的视图层次结构。 当来自一个视图控制器的视图被“剥离”并放置在另一个控制器的视图层次结构中时,就会发生这种情况。 这导致许多视图控制器的外观和旋转方法未被调用,从而导致意外行为和不良的用户体验。 苹果的演讲可以在这里找到:WWDC 2011 —会话102。该解决方案相当简单,因为所有UIViewController类都具有旨在添加和删除子控制器的方法。 实际上,添加或删除子视图控制器时需要调用几种方法,这些方法可以在Apple的iOS的《 View Controller编程指南》中找到。 布局 UIViewController的内容视图仅使用代码进行Auto Layout ,不使用InterfaceBuilder也不使用Auto Layout 。 我想在这个例子中尝试一些不同的东西,所以我选择只是将视图放在代码中。 这在更复杂的视图层次结构中具有一些挑战,但也具有一些优点。 缺点是可能涉及一些复杂的数学运算,因为您需要手动计算每个视图的位置和大小。 在这种简单的层次结构中,这相对容易一些,但是在更复杂的视图中,您可能需要将屏幕划分为多个部分,手动构建这些视图,然后将所有视图组合在一起。 组合是编程中最强大,最重要的概念之一。 从好的方面来说,这意味着布局更改相对容易处理,没有添加/删除或调整的限制。 我们重写viewWillLayoutSubviews 并计算视图的框架。 每当旋转设备时,都会再次调用此方法,并相应地调整视图框架,这非常好。 希望您喜欢这篇文章。 在构建应用程序时,请尝试将构图积极地融入设计中。 即使只是将状态属性分离成枚举,创建新的类型来保存方法参数,封装网络代码或将视图创建代码移到单独的类中的小步骤,也可以使您的应用程序更易于理解和维护。 最终项目可以在这里找到:ViewControllerContainment 资料来源 [1] Dave DeLong博客 [2] SwiftBySundell [3]与Swift合作 [4]阴影图像 [5]图示8 […]
视图的内容模式属性指示如何布置其内容。 在“界面生成器”中,可以在“属性”检查器中选择各种模式。 让我们使用两个图像视图来查看各种模式如何工作。 缩放以填充 图像的高度和宽度被拉伸以匹配UIImageView的大小。 纵横比拟合 图像的最长边(高度或宽度)被拉伸以匹配视图。 这使图像尽可能大,同时仍显示整个图像且高度或宽度不失真。 (我将UIImageView背景设置为蓝色,以便其大小清晰可见。) 外观填充 图像的最短边(高度或宽度)被拉伸以匹配视图。 像“宽高比”一样,图像的比例不会偏离其原始宽高比。 重画 重绘仅适用于需要自行缩放和调整大小的自定义视图。 我们没有使用自定义视图,因此我们不应该使用重绘。 请注意,这里的UIImageView只是给我们提供了与“缩放以填充”相同的结果,但是它在后台进行了更多工作。 中央 图像在视图中居中,但图像的长度和宽度未拉伸。 最佳 图像的顶部边缘在视图顶部水平居中,并且图像的长度和宽度未拉伸。 底部 图像的底部边缘在视图底部水平居中,并且图像的长度和宽度未拉伸。 剩下 图像的左边缘在视图的左侧垂直居中,并且图像的长度和宽度未拉伸。 对 图像的右边缘在视图的右侧垂直居中,并且图像的长度和宽度未拉伸。 左上方 图像的左上角位于视图的左上角。 图像的长度和宽度未拉伸。 右上 图像的右上角位于视图的右上角。 图像的长度和宽度未拉伸。 左下方 图像的左下角位于视图的左下角。 图像的长度和宽度未拉伸。 右下 图像的右下角位于视图的右下角。 图像的长度和宽度未拉伸。 笔记 如果内容(在我们的情况下为图像)与视图的大小相同(在我们的情况下为UIImageView),则更改内容模式不会有明显的区别。 请参阅此问题,以获取有关UIImageView以外的视图的内容模式的讨论。 在Swift中,要设置以编程方式设置内容模式,请执行以下操作: imageView.contentMode = UIViewContentMode.scaleToFill imageView.contentMode = UIViewContentMode.scaleAspectFit imageView.contentMode = UIViewContentMode.scaleAspectFill imageView.contentMode = UIViewContentMode.redraw imageView.contentMode […]
Jadi seperti apakah底部应用程序栏berdasarkan spesifikasi dari材质设计? 贝里库特·阿达拉·康托·坦皮兰妮 Berdasarkan namanya,苏达·耶拉斯·卡劳·科彭宁(sudah jelas kalau Komponen)影集 Walaupun pada iOS kita masih bisa mengatur frame dari MDCBottomAppBarView karena class ini tak lain merupakan turunan dari UIView 。 Untuk mulai menggunakan komponen ini,kita cukup menambahkan baris berikut pada Podfile : pod’MaterialComponents / BottomAppBar’ MDCBottomAppBarView角色MDCFloatingButton bawaan。 MDCFloatingButton sendiri telah kita bahas pada tulisan […]
这次我的职位很晚,但是昨天德国在世界杯比赛中德国对墨西哥(0:1)的糟糕表现后,我非常疲惫。 我本周了解到… 视图和控件 自动布局,堆栈视图和尺寸类别 我这周最努力地与… 游乐场!!! 😠 如何修复永久运行的游乐场 我真的很喜欢Playgrounds,并且可以运行Swift代码并立即查看结果,但是本周我遇到了一些奇怪的行为。 打开新的Playground并编写一些代码后,Xcode突然崩溃,或者Playgrounds永久卡住。 我几次重新打开Xcode,但是每次都发生相同的问题。 我感到非常失望,因为我认为Playgrounds是探索Swift编程语言并让每个人都可以访问编程的好工具。 但是目前,结果恰恰相反。 经过研究,我想出了一个解决方案。 将Playground从自动运行更改为手动->按住左下角的小箭头 退出Xcode 在活动监视器中强制完全处理com.apple.coresimulator 重新启动Xcode 这应该可以解决问题,但是每次进行一些更改时都必须手动启动它。 了解更多信息。 Xcode游乐场卡在“运行游乐场”或“启动模拟器”上,无法运行… 每次我创建一个新的游乐场以测试一些代码时,Xcode都会卡住并且不会运行该代码。 只是… stackoverflow.com 我希望苹果能尽快解决此问题,因为现在Playgrounds与使用Swift进行iOS开发毫不费力地相反,并且通过此修复,您可以在进行更改后松开热装。 😞 参加可可豆聚会 上周三,我去了Cocoaheads在柏林的Sauce Labs办公室聚会。 这是我第一个iOS开发人员见面,所以我感到非常兴奋。 地点是美丽的,人民很好和善良。 拿了一片比萨饼和一瓶啤酒后,我准备好进行演讲了。 丹尼尔·保卢斯(Daniel Paulus)谈论了反向工程iOS内部的实用方法,增强现实:Berta Devant的《从设计到开发》,以及鲍勃·戈德温(Bob Godwin)的Swift关联类型设计模式。 我必须承认,第一个和最后一个谈话在我目前的水平上已经取得了很大进步,但是所有主题仍然非常有趣,我想稍后再回到此以进一步了解它。 每个月都有另一个聚会,我期待下一个聚会。 如果您有兴趣,请访问https://www.meetup.com/de-DE/Cocoaheads-Berlin/。 构建我的第一个应用 为了练习现在正在学习的内容,我想开始我的第一个项目。 我完成了一些小型指导项目,产生了示例应用程序,但是这次我想启动自己的应用程序。 这个学期我要参加关于计算(或理论计算机科学)基础知识的讲座。 对我来说,绕开像自动机理论这样的超级抽象主题是非常具有挑战性的。 此外,还有许多符号和定义很难记住。 对每个主题都有一些易于理解的总结,以及符号和定义的集合,将是很好的。 我的目标是为此目的创建一个简单的应用程序,并将其分发到App Store中,以帮助其他学生和我自己。 在德语中,我们将该主题称为“信息基础理论”,它将转化为理论计算机科学。 在uni,我们将其缩写为“ TheGI”。 因此,名称将为“ TheGI-App”(直到我会发现更好的东西)。 本周目标 制作TheGI […]
样板通常变成带有功能参考功能的意大利面条板,功能参考功能引用其他功能。 Shaper是使您摆脱意大利面条的一种方式。 您可以简单地将代码添加到段中,然后构建您的项目。 就是这样: 1.拖放文件夹 :我们建议您仅包括要在项目中使用的文件,例如主题文件夹。 2.创建一个细分 :细分是您要一遍又一遍引用的代码块。 确保您的段名称清楚地说明了代码的作用。 例如,这是控制页面布局的代码段: 3.将代码添加到段中:在段中包括整个文件或代码块。 Shaper允许您在文本文件内外添加代码。 3.添加更多的细分:代码细分得越好,重复的次数就越少。 尝试为每个代码构建块创建一个段。 5.添加占位符段:使用占位符,每次构建项目时,主题名称或任何特定于项目的文本都可以更新。 将细分设置为占位符,然后突出显示要保存为占位符的文本: 6.构建项目 :所有细分和占位符到位后,就可以构建项目。 选择要包含的细分(不包含的细分中的代码除非是其他细分的一部分,否则不会导出),然后填写占位符。 完成所有操作后,将生成您的项目: 7.构建更多项目:希望您的新分段代码是将来所有项目的基础。 根据需要构建任意数量的项目。 未来是有组织的! – 您可以在getshaper.com上免费下载Shaper。 我们刚刚启动Beta版,所以请告诉我们您的用法。 谢谢!
使用最新的API(在iOS 6中引入)使出站和自定义基本UITableViewCell ,您将执行以下操作: 这样做的主要原因是register与dequeueReusableCell方法之间的完全独立性: dequeueReusableCell不知道您之前是否注册了一个单元,并且无法推断其类型。 因此,它需要从UITableViewCell强制转换为自定义子类。 解决此问题的常用方法是: 还记得我们在iOS 6之前对单元出队的方式吗? 使用旧的dequeueReusableCell方法,并在该方法失败的情况下创建一个新的单元格。 我们没有在任何地方注册单元格类型。 使用此方法具有重要的优点: 使单元出队的所有必要代码都在同一位置:这正在改善您的本地推理。 您不需要使用任何解决方法:编译器不会引发任何错误,代码也不会崩溃,并且它不会无声地失败(当然,从技术上讲,它可以,但是前提是您分配了不同的单元格标识符。)继续阅读)。 由于所有代码都在一起,因此您可以将单元标识符设置为常数并重新使用它,从而避免了我们之前确定的可能的故障点之一。 由于现在开发人员是负责初始化单元的人(不再自动完成),因此编译器确保强制类型转换和新创建的单元属于同一类型。 这样可以避免我们谈论的另一个故障点:不可能有不同的类型(编译器会引发错误)。
在我上周阅读@nickoneill的出色文章《加快Swift的缓慢构建时间》之后,很难不以稍微不同的角度来看待Swift代码。 现在,只有一行可以被视为干净的代码提出了一个新问题-是否应将其重构为9行以使编译器满意? ( 请参见下面的nil合并运算符示例 )更重要的是什么? 简洁的代码还是编译器友好的代码? 好吧,这取决于项目规模和开发人员的挫败感。 但是等等……有一个Xcode插件 在介绍一些示例之前,让我首先提到手动检查日志文件非常耗时。 有人想出了一个终端命令来简化它,但我更进一步,将Xcode插件组合在一起。 以我为例,最初的目的只是确定并修复最耗时的区域,但我现在认为它必须更多地是一个迭代过程。 这样,除了使代码更有效地构建之外,我还可以防止耗时的函数首先进入项目。 惊喜不止 我经常在Git的各个分支之间来回跳动,而等待一个缓慢的项目来编译往往会浪费大量时间。 我一直想知道为什么我的一个宠物项目(大约2万行Swift代码)的构建速度如此之慢。 在了解了真正的原因之后,我必须承认我真的很惊讶看到单行代码需要几秒钟的编译时间。 让我们看几个例子。 无合并运算符 编译器当然不喜欢这里的第一种方法。 展开两个视图后,构建时间减少了99.4% 。 ArrayOfStuff + [Stuff] 这是这样的: 返回ArrayOfStuff + [Stuff] // 而不是 ArrayOfStuff.append(stuff) 返回ArrayOfStuff 我经常这样做,并且每次都会影响所需的构建时间。 以下是最糟糕的情况,此处的构建时间减少了97.9% 。 三元运算符 通过用if else语句代替三元运算符,构建时间减少了92.9% 。 如果将地图替换为for循环,它将另外下降75%(但是我的眼睛会受伤)。 😉 将CGFloat转换为CGFloat 不知道我在想什么。 这些值已经是CGFloat,并且某些括号是多余的。 清理混乱之后,构建时间减少了99.9% 。 回合() 这真是奇怪。 以下示例变量是局部变量和实例变量的混合。 问题可能不是舍入本身,而是方法中的代码组合。 但是,除去舍入后的结果相差很大,准确的说是97.6% 。 //建立时间:1433.7ms 设展开= a […]
移动平台正在迅速取代台式计算机。 他们将在未来几年中获得重要的市场份额。 传统的应用程序开发公司必须发展,这不足为奇。 他们必须重新获得开发应用程序的资格。 他们需要在iOS和Android平台上都这样做。 企业将移动应用程序视为其营销策略的重要组成部分。 拥有一个网站还不够。 先进手机的采用率太高。 他们定期购买越来越多。 移动应用开发公司必须提出新的策略。 他们必须引入新的应用程序来为这些业务提供帮助。 在这种情况下,iOS应用程序开发公司将重新评估其地位。 它必须创建对客户而言令人愉悦且有价值的iOS应用。 这些应用程序应该响应迅速。 客户不喜欢加载时间太长的那些应用程序。 他们将其卸载,不再使用。 因此,开发公司必须确保哪个应用程序可以快速加载。 它也应该快速执行。 随之而来的是控制。 iOS应用程序开发备受关注。 应该选择开发所需的正确技术。 有两种用于iOS应用开发的编程语言。 Objective-C和Swift。 让我们看看您可以使用哪种技术来开发iOS应用。 目标C 它是许多移动应用程序开发公司使用的重要编程语言。 他们将其用于iOS和OS X编程。它是C语言的超集。它提供了对象定位的功能。 它还提供了动态运行时。 它继承了C的语法,流控制说明和原始编写。它还包括用于定义策略和类的语法。 它包含用于对象文字和对象图管理的语言级帮助。 它提供动态类型以及绑定。 它将各种义务推迟到运行时。 迅速 它是OS X和iOS应用程序最近引入的编程语言。 它扩展了C语言和Objective-C的最佳性能。 它没有C兼容性的约束。 它接收更安全的编程实例。 它使编程更有趣,更灵活且要求更低。 因此,现在您想知道哪种技术最适合iOS应用程序开发。 选择哪种技术? iOS应用程序开发方面的专家提出了一些有趣的发现。 他们声称Swift的大幅崛起不会导致Objective-C的突然灭亡。 但是,它无疑将成为iOS应用程序开发人员的明显选择。 他们将更多地使用它来开发iPhone,iPad,Apple Watch等应用。 Objective-C仍然受到保护,并保持更快的速度。 它经过编译器升级,并且具有出色的交互式状态,因此包装非常好。 这有助于响应式和面向消费者的应用程序开发。 所有这些都是无缝发生的。 iOS应用程序开发人员对于选择哪种技术感到困惑。 Swift对阅读和编写代码的要求大大降低。 它类似于普通英语,语法比Objective-C简单得多。 Swift还最大程度地减少了单调的事务,簿记和工作量。 […]
最近,我遇到了在单个UIView上具有多个阴影的要求。 要求非常简单: 具有1px宽度的外围阴影。 像Material design中一样,具有一个可变的环境阴影以产生高程感。 预期结果如下: 我想使这种elevation通用,以便可以应用于任何视图。 事实证明,我在这段代码上的经历与我所期望的不一样。 在本文中,我将讨论用于获得设计人员所需内容的代码的演变。 乍一看,似乎我可以将layer.border用作外围阴影,但是它并没有产生预期的结果。 使用layer.border似乎要暗得多,并且没有像使用shadow那样得到的扩散: 为了使该方法通用,我在UIView创建了一个名为applyShadows的扩展,并添加了以下代码段中所示的代码。 第一次尝试—使用BezierPaths 第一次尝试是在view layer上使用UIBezierPath : 直到我根据预期可以应用该标高的view尝试了这一切之后,一切似乎都运行良好。 如下图所示,高程代码未考虑对要应用高程的视图的子视图进行四舍五入的情况。 这导致UI损坏: 如上图所示,虽然父视图具有圆角和阴影,但subview没有圆角。 第三次尝试-阴影图层上的插图 为了解决舍入的问题,我不能使用clipsToBound因为它会导致阴影也被修剪。 作为一种解决方法,我想到了使用与cornerRadius相等的边插入量。 但是,此方法只能在某些特定情况下使用。 例如,如果subview是可滚动的,并且在滚动时期望接触父视图边界,则此方法将不起作用。 下图直观地显示了问题: 在上图中,黄色是父视图,青色是子视图。 这种方法更多的是破解而不是解决方案。 这隐藏了问题,而不是解决问题。 第4次尝试-遮罩子视图 UIView提供了一个称为mask的属性,该属性似乎是我在第三次尝试中遇到的问题的解决方案。 使用mask ,我们可以舍入子视图而不会在阴影上留下斑点: 通过这种尝试,我们解决了非四舍五入的子视图的问题,并且我们也没有任何其他插图。 尽管这种方法似乎可行,但这再次给可滚动子视图带来了问题: 在上面的gif中,蓝色是父视图的颜色,其中包含可滚动的子视图。 子视图有9个项目,但我们仅看到4个项目,因为其他项目被应用的蒙版隐藏了。 第5次尝试-使用阴影附加视图 因此,对于我不断clipToBounds的问题的解决方案很明确-我必须在视图上使用clipToBounds才能在拐角处获得所需的舍入。 这也意味着我不能再在有关视图上应用阴影。 但是,我仍然可以使用以下方法获得所需的外观: 创建与当前框架相同的其他视图。 使用子图层方法向新视图添加阴影。 将新视图放置在当前视图的后面。 在当前视图上设置clipsToBounds 。 就是这样。 奖金提示 图层名称:您必须已经注意到我已经将layer.name设置为一个值perimeterShadow 。 这用作删除/调整图层大小的标识符,在这里我可以查询所有子图层以获得阴影图层。 图层的背景颜色:如果未设置layer.backgroundColor ,则阴影不会显示。 图层动画:您可以查询图层的动画以获取关键点, position以获取视图的duration和timingFunction […]