Tag: interface builder

仍然想知道IBDesignable和IBInspectable是做什么的?

现在是2019年,XCode 10在这里,iOS 12在这里,但我们甚至没有提供通过XCode接口构建器为UIView / UIbutton或任何其他UIView子类提供圆角/边框半径/边框宽度的规定。 啊! 有点令人沮丧,对不对? 当然,我们可以通过编程来完成所有这些工作。 但是,请思考一下,为什么您可以编写一些原始代码并想象一下它的外观,当您可以轻松地在Interface Builder中修改值并使用IBDesignable和IBInspectable查看实时更改时! 在本文中,我将说明如何使用界面生成器添加边框颜色,边框宽度和角半径。 因此,让我们开始吧。 IBDesignable和IBInspectable 将@IBInspectable添加到属性时,它将在XCode中将该属性公开给属性检查器。 您可以在属性检查器中修改值,而不用编程方式进行修改。 但是,当您尝试更改值时,界面构建器将不会实时显示更改。 为了查看更改,您需要构建并运行项目。 但是,嘿! 这是聚会的把戏。 我们可以使用@IBDesignable来处理此问题,它会告诉XCode在您修改值时呈现实时更改。 现在,让我们看看下面的示例类。 导入UIKit @IBDesignable 类CustomView:UIView { @IBInspectable var borderColor:UIColor? { 得到{ 返回UIColor(cgColor:layer.borderColor!) } 设置{ layer.borderColor = newValue?.cgColor } } @IBInspectable var borderWidth:CGFloat { 得到{ 返回layer.borderWidth } 设置{ layer.borderWidth = newValue } } @IBInspectable var cornerRadius:CGFloat { […]

构建本机移动用户界面

移动工程师Tony Nguyen的问答 当您首次加入Personal Capital时,有关移动开发的最大惊喜是什么? 在以前的职位上,我的同事和雇主使用“所见即所得”(WYSIWYG)编辑器来构建其移动应用程序的用户界面。 这意味着使用用于Xcode(iOS)的界面生成器和用于Android的布局编辑器。 但是在Personal Capital,我们通过代码构建UI。 为什么Personal Capital移动工程选择不使用所见即所得编辑器? 最大的原因是性能。 在将XIB文件和情节提要加载,解析和转换为代码时,编译器必须处理更多的开销。 这会产生不必要的工作。 在大型项目中,这可能会对性能(例如应用程序启动)产生重大影响。 移动应用程序的初始应用程序启动至关重要,因为它会影响用户是否使用您的应用程序以及使用该应用程序的时间。 另一个原因是可重用性。 在代码中构建UI可以让我们通过继承重用UI组件。 例如,单个应用程序中的大多数UI组件具有相同的样式。 代替重复创建UI组件,我们可以使用基本的UI类,该类包含我们想要的所有属性,并仅实例化该对象。 任何小的偏差,我们都可以简单地从基数开始扩展并相应地进行更改。 通过从代码编写UI,我们可以使代码保持DRY(不要重复自己),并使代码更加一致。 以编程方式创建UI的学习曲线如何? 最难的部分是新员工需要大量增加。 没有关于界面外观的即时反馈。 我发现缺少即时反馈确实迫使我理解并思考为什么以及在哪里需要放置UI元素。 如果您多加考虑,有时可以简化复杂的UI布局! 对于那些习惯使用所见即所得编辑器的开发人员来说,学习曲线有些陡峭。 但是,我们认为以编程方式创建UI有利于开发人员的成长。 您真的很了解以编程方式完成的工作—尤其是视图生命周期可能变得多么复杂和令人困惑! 但是,一旦克服了学习曲线,就会发现您对应用程序中发生的事情有了更好的控制。 与使用WYSIWYG编辑器构建的iOS UI相比,编码的iOS UI更易于测试吗? 我们发现,以编程方式构建UI时,与通过WYSIWYG编辑器相比,UI测试更为简单,因为在编程视图中强制分离了责任。 好的做法是不要将业务逻辑与构建UI混合使用。 这使我们更容易测试。 我们使用Xcode的XCTest框架编写测试-如果您对我们的贡献感兴趣,我们正在招聘!

IBDesignable / IBInspectable –设计人员的梦想

使用IBDesignable进行实时渲染。 我知道。 我去哪儿了? IBDesignable和IBInspectable背后的核心思想是,您可以在Attribute Inspector中为自定义类创建自己的属性。 例如,在下面的图像中的“属性”检查器的顶部,您可以看到特定于我的PieView类的自定义属性,例如“环形颜色”,“背景图像”,“背景层颜色”等。 宣告👾 将类声明为an @ IBDesignable会激活实时渲染功能。 要将新属性声明为使用实时渲染功能,必须在声明之前使用@IBInspectable关键字。 定义新属性时,必须显式定义其类型。 属性检查器需要明确的类型定义,才能知道提供属性的值的类型。 并非所有类型都受支持。 支持的类型包括:Int,Double,String,Bool,CGFloat,CGPoint,CGSize,CGRect,UIColor和UIImage。 优点🎨 IBDesignable / IBInspectable使您可以灵活地直观地查看所做的更改,而不是不断运行您的应用程序。 不仅如此,而且由于您可以直接在界面生成器中进行更改,因此,如果您与具有界面生成器知识的设计人员一起工作,则无需进行开发人员就可以轻松地进行视觉更改并进行视觉更改。 每个人都赢🎉 以下是用于创建上面的饼图的PieView类的示例,请随时查看。 直到下一次#TFHout✌🏾 完整的项目可以在这里找到:https://github.com/theFlawlessHack/ibdesignable-pie-chart-ios 你走到了底部❤️

自动布局Swift 3

Un enquequevíacódigo ¿Quées el自动版式? 在自动布局和手动模式之间,在手动和手动模式下进行可视化。 Hay dos Implementaciones del Autolayout,无需使用Storyboard或Apple llama的InterfaceBuilder,也可以使用基于锚点的方法进行操作 。 安博斯(Ambos)征服了儿子的证明,并证明了他在西班牙的保护性和合法性。 界面生成器 Echemos un vistazo a la manera como funciona Interface Builder。 Cuando abrimos和Storyboard aparece un rearea se de no nos mover las vistas y empezar a jugar con ellas。 阿奎斯·唐德·科多恩扎 弱势群体,维莫斯·辛科·埃尔拉门蒂斯·德·伊基奎尔达·德·雷科查·阿尔·佩雷斯,《现实世界》,《限制条件》,《反对革命》,《反对派》,《 Herramienta podemos reubicarlas。 StackView上的segundo icono es para agrupar las vistas seleccionadas […]

Xcode 8中Interface Builder中的大小类

自动布局非常适合根据约束条件对布局进行调整,但有时布局需要根据设备类型,屏幕尺寸或方向进行更重要的调整。 也许您可能想要: 巨大的iPad Pro屏幕上的字体大小比小巧的iPhone SE更大。 在横向或纵向模式下,iPhone上的视图布局将有所不同。 在您的iPad版本的应用程序中提供其他按钮。 当您的应用处于滑行或拆分视图模式时,可以不同地布局内容。 您如何对布局进行这些调整? 在iOS的早期版本中,您可能有多个iPad和iPhone的情节提要。 或者,也许您已使用设备方向或窗口大小来确定用于布置场景的环境。 随着越来越多的设备,分割视图控制器(在iOS 8中引入)以及滑动和分割视图多任务模式(在iOS 9中引入)使调整布局以适应其环境变得更加复杂。 为简化起见,Apple建议使用新的范例。 而不是根据许多设备类型,分辨率,多任务处理模式和设备方向来考虑布局,您应该集中精力将布局调整为两种宽度(分别称为紧凑型和常规型)和两种高度(也紧凑型和高型)。定期)。 这些区别称为尺寸等级。 然后,您可以使用这些尺寸类来定义或调整布局。 尺寸等级将所有不同的潜在水平和垂直构型减少为两种:紧凑型,适用于有限的空间; 并经常在有限的空间内使用。 例如,iPhone纵向定位被认为具有紧凑的宽度和规则的高度。 有关尺寸类别如何与设备和设备方向相对应的全面细分,请参见图1。 在定义尺寸类别时,Apple做出了一些有趣的决定,值得注意: 在横向放置时,iPhone(6+和6S +除外)的宽度仍被认为是紧凑的。 所有处于纵向或横向模式的iPad都被认为具有常规的宽度和高度。 这意味着iPad方向的改变不会触发尺寸类别的改变。 尺寸类别不仅描述了设备类型和方向。 在iPad多任务处理模式下(例如“滑行”,“分割视图”和“并排”(见图2))显示应用程序时,大小类还描述了应用程序的环境。 请注意,尽管某些iPad多任务处理模式的水平尺寸类别可能会更改,但垂直尺寸类别仍保持常规。 实际上,紧凑的垂直尺寸级别足以表明我们正在横向模式下使用iPhone。 您可以使用Size类做什么? 大小类不能替代约束和自动布局,而是可以协同工作。 您可以使用尺寸类别对布局进行许多更改,例如: 可以调整视图的大小或位置。 字体和颜色可以更改。 可以激活或停用约束(称为已安装和已卸载)。 可以添加或删除视图(也称为安装和卸载)。 Interface Builder中的大小类 尽管您可以根据代码中的不同大小级别调整接口,但最简单,最方便的方法通常是使用Interface Builder ,尤其是在Xcode 8更新中添加的功能。您可以在Interface Builder中简单地将布局和约束分配给特定的大小级别,并且尺寸类发生变化时,布局也会自动更新-无需编写任何代码! 您将探索如何在具有非常简单布局的应用程序中的Interface Builder中为不同大小的类添加自定义项,并显示带有标题和正文的文章。 首先,您将构建iPhone界面,该界面在标签中包含标题,在文本视图中包含正文(请参见图3左侧的iPhone布局)。 但是,这种布局在iPad上看起来不太好(图3中央的布局)。 要解决此问题,您将使用尺寸类来调整界面(右侧布局)。 请注意布局之间的细微差别,而不是细微差别-随着iPad的空间增加,您将要调整字体大小,边距大小并添加字幕标签。 让我们从设置基本界面和约束开始。 创建一个简单的Single View Application,并将其称为SimpleSizeClasses。 […]

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。 […]

Swift4秘诀:如何以更好的方式处理序列标识符

func navigationToShowDetailController(){ self.performSegue(withIdentifier:“ showDetail”,发送者:nil) } //标记:-Seguesoverride func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 如果segue.identifier ==“ showDetail” { 如果让indexPath = tableView.indexPathForSelectedRow { 让object = objects [indexPath.row]为! NSDate 让controller =(segue.destination as!UINavigationController).topViewController as! DetailViewController controller.detailItem =对象 controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem controller.navigationItem.leftItemsSupplementBackButton = true } } } 由于我们使用字符串作为segue标识符,因此无需进行编译时检查,而且输入错误可能导致运行时崩溃。 此代码也很难推理。 例如,如果您错过了prepare(for:sender:)的segue标识符检查,会发生什么情况 当代码中存在多个问题时,情况将变得更加糟糕。 解决方案:将segue标识符定义为枚举,并享受强大的数据类型带来的所有好处。 枚举SegueIndentifier:字符串{ case showDetail =“ showDetail” } //标记:-Seguesoverride func prepare(用于segue:UIStoryboardSegue,发件人:任意?){ 警卫队让identString = segue.identifier,让标识符= SegueIdentifier(rawValue:identString)else […]

iOS操作方法-添加自适应约束以支持通用应用

Xcode的界面生成器使我们能够配置布局,这些布局将根据一系列环境变量自动更改形状和大小,例如: 设备屏幕尺寸(例如iPhone或iPad) 设备方向(人像或风景) 适应(在iPad上执行多任务处理) 在本文中,我们将学习如何在界面构建器中添加NSLayoutConstraints来适应这些变量的变化,从而使我们能够构建可在iPhone和iPad上运行的通用应用程序。 术语 首先,一些有用的术语。 特性-上面描述的每个环境变量都是一个特征; 屏幕尺寸,方向和适应性。 设备配置-设备配置是上述三个特征的组合; 屏幕尺寸,方向(纵向或横向)和适应性(以多任务模式运行的iPad在分屏中显示,称为适应性)。 尺寸类别-尺寸类别是一种特征,标识可用于视图的宽度(水平)或高度(垂直)的相对量。 尺寸等级取决于已经描述的三个特征。 接口构建器定义了两个大小类。 紧凑(在纵向模式下,iPhone宽度紧凑,iPhone高度固定)和常规(在横向模式下,iPhone宽度规则,iPhone高度紧凑)。 添加自适应约束 为了演示如何添加自适应约束,我们将使用以下简单(有些许人为!)的示例,将一个UIView添加到另一个视图。 我们的目标是添加根据环境变量而适应和变化的约束。 这将导致三种布局变化: iPhone,肖像 —我们添加的视图应为矩形,固定在设备的左侧,并垂直居中。 iPhone,横向 —我们添加的视图应为正方形,固定在设备顶部,并水平居中。 iPad,纵向或横向 -我们添加的视图应为矩形,固定在设备的右侧,并垂直居中。 注意:我们仅针对本文开头提到的三个特征中的两个调整约束。 我们没有根据iPad改编(多任务分屏)改编。 换句话说,我们只处理iPad上的全屏模式。 这纯粹是为了简洁。 下面描述的步骤可以轻松地应用于此特征。 我们从界面构建器开始,使用仅包含默认UIView的UIViewController。 我们添加一个新的UIView作为子视图,并更改其背景颜色以使其易于识别。 现在,通过单击界面生成器左下方的“查看方式:…”按钮来打开设备配置窗格。 上面显示的设备配置窗格允许我们选择设备,方向和适应性(如果选择了iPad设备)。 在上图中,所选设备为iPhone 8 Plus,方向为纵向。 设备配置窗格还向我们显示了所选设备配置的尺寸类别。 在这种情况下,宽度尺寸类别是紧凑的,而高度尺寸类别是规则的。 这由设备配置窗格顶部的“(wC hR)”文本指示。 现在,我们将为第一个布局变体(纵向iPhone)添加约束。 点击右下角的“因性状而异”按钮。 出现一个弹出窗口,使我们可以选择要为其创建布局变体的尺寸类特征,例如宽度,高度或两者。 选择一个尺寸类别特征,将基于当前所选设备配置的尺寸类别创建一个变体。 例如,如果我们选择宽度,则变化将适用于所有紧凑宽度,因为这是当前所选设备配置的宽度尺寸类别。 在我们的情况下,我们要基于所选设备配置的宽度和高度尺寸类别创建一个变体。 在弹出框中选择这两个选项。 在弹出框外单击以将其删除,现在我们将为该布局变化添加约束。 请记住,在iPhone纵向模式下,我们添加的视图应为矩形,固定在设备的左侧,并垂直居中。 在我们添加的视图中添加100的宽度约束,以及600的高度约束。然后将视图的前沿约束到安全区域的前沿,并将视图的中心Y值约束到安全区域的中心Y值。 添加约束后,点击右下角的“完成变化”按钮。 添加的约束和结果布局如下所示。 现在,我们进入第二个布局变体,即横向iPhone。 我们当前选择的设备配置为竖向iPhone […]

接口本地化

如果我们将应用定位到比我们的国家更广泛的范围,则最好对应用进行本地化以使用户易于理解。 一个很好的习惯是用您的母语(至少是英语)本地化应用程序。 在iOS应用程序中进行本地化可能有点棘手。 UI国际化 过去,本地化接口文件(xib或情节提要)时,xCode使用* language-code * .proj创建该文件的克隆。 我们具有完全相同的文件,可以在其中更改UI组件(如标签,按钮等)的属性。 这种方法的一个优点是,我们可以为不同的国家定义完全不同的UI。 基础国际化 为了避免克隆界面文件,我们可以在“项目常规”选项卡中标记“ 使用基础国际化”复选标记,而不是我们可以选择使用界面文件或字符串文件来国际化应用程序的UI部分。 / * Class =“ UIBarButtonItem”; title =“添加”; ObjectID =“ aFc-bV-NJn”; * / “ aFc-bV-NJn.title” =“添加”; / * Class =“ UINavigationItem”; title =“演示文稿”; ObjectID =“ cZ7-QZ-PGj”; * / “ cZ7-QZ-PGj.title” =“演示文稿”; 它减小了应用程序的大小。 我们尚未克隆我们支持的UI时代语言,但是此文件很难阅读/理解,甚至更难以维护。 当我们添加新的UILabel时,xCode不支持生命更新字符串文件。 使用代码本地化UI 当我们从代码构建整个视图时,很自然地从代码中设置本地化的字符串。 Wen我们有Xib或Storyboard文件,对每个控件进行输出并转换显示的值很奇怪。 我看到了一种解决方案,其中有人使用一种新颖的方法,该方法遍历视图层次结构中的所有子视图并根据标签或用户定义的运行时属性来翻译标签以查找翻译凯。 当我们添加新的本地化视图时,这会导致在viewDidLoad,awakeFromNib或其他初始化方法中调用一些代码……很多工作。 我的解决方案 在iOS应用程序中构建UI三年之后,我得出了一些结论,即如何构建易于维护和扩展的UI。 从一段时间以来,我几乎在Interface Builder中定义的每个组件都使用自定义类。 […]

从UIView加载一个UINavigation控制器

我正在devise一个具有login屏幕的应用程序。 它是一个用户名/密码和提交button的UIView。 一旦用户authentication成功,我想加载一个新的xib文件,其中包含导航控制器和导航栏。 下面的酒吧我想加载一个tableView和其他视图之间切换,因为我随着它的编程。 我所做的就是创build一个从UINavigationControllerinheritance的新类,并组装xib文件以包含导航控制器。 我把它挂回到文件的所有者,我像这样模态地加载导航控制器: myNavController* navVC = [[myNavController alloc] initWithNibName:@"navXibFile" bundle:nil]; [self presentModalViewController:navVC animated:YES]; [navVC release]; 当导航控制器出现时,这个工作正常。 然而,即使我在IB中设置了一个,它也没有标题。 此外,tableView的代表通过IB连接,但我甚至看不到空行。 所有我看到的是一个空的导航栏在顶部和空白视图(一块)下面。 感谢您的帮助。