iOS开发教程| 具有自动布局的自适应接口设计
在开发适用于iOS的APP时,很少有同一屏幕在纵向和横向方向上组成不同的情况。 今天,我们为您提供此IOS开发教程。 然后,您将能够为您的应用程序开发自适应界面。
多年来,使用Xcode面对这种问题的方式有所不同。 从通过代码重新定位组件,到为每个版本创建不同的布局。
自动版式提供了一种管理此工厂的新方法。 “尺寸类别特定的布局”由每个xib中的一个选项组成,该选项允许根据屏幕的不同尺寸定义特定的行为。 不仅对方向更改有用,而且对不同的屏幕尺寸或布局容器中的更改(例如iPad上的SplitView的主视图控制器)有用。
该工具允许针对不同的屏幕尺寸和配置建立不同的行为,而无需诉诸于代码更改或拥有更多xib文件。
在Xcode 8中被选项Vary for traits取代,该选项具有非常相似的行为,尽管在初次使用时可能会引起混淆。
让我们通过此功能提供的选项进行一些导航,并使用AutoLayout中的约束制作一个示例屏幕,这使我们仅使用界面元素组成的更改即可重复使用相同的设计。
该示例将非常简单,并且我们将在纵向和横向(垂直和水平)中使用具有不同可视化效果的AutoLayout。
iOS开发:创建ViewController
首先,我们创建了一个新的Xcode项目。 在向导中,我们选择“单一视图应用程序”。 创建的项目由其AppDelegate和ViewController以及Main.storyboard组成。
在此示例中,我们将替换Main。 带有xib文件的情节提要,其中仅包含我们要设计的屏幕。
为此,我们创建一个名为ViewController.xib的xib文件,并在ViewController.m类中添加以下代码:
-(id)init {ViewController * controller = [super initWithNibName:NSStringFromClass([self class])bundle:nil]; 返回控制器; }
在xib中,在Identity Inspector的Custom Class字段中建立我们的类的名称很重要:
并将“连接检查器”中的“视图”字段拖到控制器的主视图中。
到目前为止,我们已经创建了视图的控制器,并与其文件生成器接口链接。 仅需要从AppDelegate.m中打开它
–(BOOL)应用程序:(UIApplication *)应用程序didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//应用程序启动后进行自定义的替代点。
ViewController * viewController = [[ViewController alloc] init];
UINavigationController * navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
self.window.rootViewController = navigationController;
返回是;
自动版式
现在,将字段添加到我们的控制器中。 我们将设置一个Login屏幕,其中包含一个徽标,几个用于添加用户和密码的文本框,最后是一个页脚。
为此,我们将使用AutoLayout,在以下部分中,我们将注意,当我们将iPhone置于“横向”位置时,无需滚动,因为Vary可以动态更改组件的位置特质。
有多种方法可以创建此屏幕,其中有些可能更简单,更直观,但是我们将选择使用iOS 9中引入的UIStackView组件,因为它会自动执行一些功能,从长远来看,我们会更舒适地使用。
首先,让我们以纵向和横向的方式添加要保留在屏幕底部的页脚,因此我们只需要添加标签并将其固定在视图底部和侧面即可。 如果文本的高度可能超过一行,我们将使高度保持动态,并使用“标签对齐”将文本在字段中居中。
现在,我们在视图中添加一个垂直的UIStackView,它将包含2个元素:一侧是徽标,另一侧是用户和密码字段。 然后将其锚定到视图的4个侧面。
现在,我们将添加2个将使它们成为容器的UIView,因为UIStackView不允许我们为每个元素建立单独的边距。 实际上,它是不允许添加背景或边缘的组件,因为它不是UIView本身,而是一个扩展的唯一目的是放置视图。
当将两个UIView都添加到UIStackView时,Xcode会抱怨我们缺少约束。 的确是这样,因为不知道每个视图将占用多少空间,因此无法将剩余空间分配给另一个视图。 通过屏幕的组成,我们希望徽标在屏幕顶部占据主导地位,而文本框位于底部。 因此,我们将选择使用等高约束为每个视图分配一半和一半。
为了清楚起见,将包含徽标的视图将为黄色,而将包含登录框的视图将为蓝色。 我们应该有这样的东西:
我们要做的就是添加徽标和文本框。 让我们从第一个开始,将视图放置在黄色视图内,并将其分配为垂直和水平居中的唯一约束。
我们已经有了“徽标”(为方便起见,我使用了UILabel,但出于实际目的,它是相同的)。 现在,对于访问区域,我们将使用另一个垂直的UIStackView,其中有3个具有透明背景(透明颜色)的视图。 其中两个带有一个带有图标和一个文本框,另一个带有访问按钮。
我们将新的垂直UIStackView添加到蓝色UIView,并在内部添加3 UIView。
现在,Xcode不知道每个视图将占据多少宽度,高度,或者UIStackView本身在我们的蓝色UIView中将位于何处。 因此,获得缺少约束的通知是正常的。 现在让我们忽略它们。
接下来,我们将在前两个视图中添加用户和密码图标,以及一个UITextView。 这将是我们设置宽度的唯一组件。 由于我们不希望它是动态的并且适合屏幕的宽度(它可能会占用太多空间,并且在视觉上不会很吸引人)。
这些图标已添加到Assets.xcassets文件夹,名称为pass_ic和user_ic。 关于约束,图标将锚定在左侧,垂直居中,并具有30×30的固定大小(因为我们的图标在这些近似尺寸内)。
例如,该文本框的宽度为200,它将通过左约束固定在父视图和图标的右侧,上方和下方。 它还将具有44的高度,因此足够舒适。
已经定义了第一个UIView的高度(这是UITextView的高度,因为它具有固定的高度并且固定在上下两个位置),并且具有宽度(它将是UITextView + UIImageView +分隔线)在它们之间,因为所有这些值都是固定的。 一旦完成所有3个视图,UIStackView容器就可以推断宽度和高度所需的大小。
我们将对密码视图和访问按钮重复该过程,将其锚定到父视图,并将此UIStackView置于蓝色视图的中心。
它看起来应该像这样:
文本框靠在一起。 分离它们而不是修改UITextView约束的一种更优雅的选择是将分离添加到UIStackView。 这可以通过修改“间距”字段从身份检查器中完成。
因性状而异
但是,我们的风景视图未完全按照我们希望的那样显示。 看不见脚,两侧浪费了很多空间,而所有重要信息都位于屏幕的1/3中。
为了解决这个问题,我们将使用选项Vary for traits,可以从InterfaceBuilder的底部访问,单击View as:
当我们单击它时,我们可以决定要为哪些情况添加具体约束。 如果它们是约束,则仅当宽度改变,高度改变或高度和宽度改变时才应用约束。 在底部,案例将以图形方式显示适用于此更改的案例。
重要的是要查看(wC hC)。 这为我们提供了适用情况的线索。 W =宽度,h =高度,右边的值可以取R =常规,C =兼容或A =任何。
几个例子是:
- 肖像iPhone将wR hR
- iPad将成为人类
- 横向使用的iPhone 7或SE将为hC hC
- 风景如画的iPhone 7 Plus
基本上,常规是指大尺寸,而紧凑型是指小尺寸。 仅适用于hC情况的约束是仅适用于视图发生变形的情况的约束,因为横向iPad不想更改它。
因此,在本例中,我们将选择横向(wC hC)的iPhone 7,然后按Vary for Traits以获取高度和宽度,向我们显示所有具有wC hC的变体。
iPhone 7 en景观(wC hC),Solccionaremos el iPhone
此时,我们对布局所做的任何更改将仅适用于这些变体。 因此,让我们更改公平性,这要归功于UIStackView和orientation参数,我们将了解它的行为方式。
首先,我们将添加一个约束,该约束指示蓝色和黄色视图的宽度相同。 这对于UIStackView的垂直方向而言并不重要,但是在横向情况下,添加它很重要:
请注意,从现在开始,当我们单击“完成变化”时,在可视化不适用该约束的情况时,我们在“变化为特征”模式中添加的约束将显示为灰色。
“相等宽度”约束仅在hC wC时(即,在iPhone环境中)使用。
现在,我们将再次对特征使用Vary,但它不会受到约束,而会在Identity Inspector中。 在wChC情况下,我们将确定希望主UIStackView是水平的。
为此,请从Identity Inspector选项卡本身中,选择UIStackView,然后单击Axis属性旁边的+ 。
我们将看到一个小菜单,其中将指示我们要在哪些情况下修改Axis属性。
在wChC情况下,我们添加了新的axis属性并将其修改为水平
结果就是我们想要得到的。 一种新设计,当我在风景中使用iPhone时可以更好地利用空间。
最后:键盘
目前,Xcode不提供任何工具(就像Android工具一样)来防止键盘隐藏文本框。
有成千上万种方法可以做到,但是没有一种方法是足够干净的。 它们中的大多数都是手动的,涉及将代码混为一谈,该行为应包含在SDK本身中。
在这种情况下,我们将使用IQKeyboardManager库(https://github.com/hackiftekhar/IQKeyboardManager),因此我们不会将代码和时间专用于已经完成的事情,而且可能做得很好。
我们将使用Carthage创建框架(也可以使用CocoaPods)。 我们将其添加到项目中,并将以下行添加到didFinishLaunchingWithOptions del AppDelegate.m中
IQKeyboardManager.sharedManager.enable = true;
综上所述
通过完成本《 IOS开发教程》的所有步骤,我们已经可以使登录屏幕正常运行。 我们只需要完成按钮功能以及颜色,设计等的添加即可。
如果经过谨慎处理,AutoLayout可以成为您的朋友。 在最新版本的iOS中,随着对约束系统的各种改进以及最重要的是UIStackView的引入,使用代码进行界面设计在大多数情况下是可以避免的,从而可以使项目更简洁,更有条理。
不幸的是,它仍然远远不够完美,Interface Builder继续显示出一些缺陷和错误,这些缺陷和错误导致了更复杂的合成中的出现,以及版本控制系统在使用中的巨大问题。 希望苹果公司将在后续的迭代中继续对其进行改进。
可以从以下链接下载项目代码:
https://www.dropbox.com/s/1m17q68sue9obqb/tutorial-project.zip?dl=0