android - AutoLayout对处理iOS屏幕大小的 fragment 有用吗?为什么Android中没有等效的工具?

标签 android ios android-layout user-interface android-fragments

我对iOS中的AutoLayout非常陌生。我已阅读其中的论文,并在WWDC中观看了两个视频。我了解在处理UI窗口小部件之间的关系方面非常有效。但是,我仍然不太了解它比传统的弹簧和结构更好。如iOS 7 UI Transition Guide!中所述:


  如果您不使用自动版式,那么现在可能是开始的最佳时机,尤其是当您需要支持应用程序的多个版本时。如果您使用手动或程序化布局技术,则您有责任确保在文本大小更改时适当调整布局。


是否有示例比较使用字符串/ struts和AutoLayout的布局实现?

此外,Android中的相对布局与AutoLayout之间是否有任何比较?两者都以相对方式处理布局问题。它们之间的主要区别是什么?

另一方面,在Android中采用AutoLayout解决碎片问题是否有用?我知道Google有自己的一套解决碎片的解决方案,例如,使用dp代替px,使用RelativeLayout。但是,程序员仍然需要为布局使用不同的XML。 AutoLayout对减少XML文件的数量有用吗?

最佳答案

我认为您的问题涉及面很广,我几乎同意2票的赞成票,但我可以向您介绍iOS中的自动版式。

当iPad不存在且iPhone OS 3是最新也是最出色的时候,我开始为iPhone编写应用程序。是的,已经有一段时间了! ;-)

当时,Interface Builder是Xcode之外的独立工具,因此Storyboards不存在。弹簧和支柱以及手动框架操纵是游戏的名称。我了解这个系统并喜欢它。特别是因为只有3.5英寸屏幕(然后出现了iPad),它使UI设计和实现变得非常容易。

引入Autolayout时,我不太在意。最初,我认为它不是非常牢固或强大,在Xcode(现已集成)的Interface Builder中设计约束很困难,而且经常违反直觉,并且整个过程比我的旧过程困难得多。

跳过一年左右,我重新讨论了这个话题。现在,Xcode能够非常可靠,快速地在Interface Builder中生成约束。仅有的2种屏幕尺寸是3.5英寸Retina,4.0英寸Retina和iPad(两者具有相同的点数,因此屏幕设计基本相同),因此屏幕设计仍然相当简单。

然后是iPhone 6/6 Plus。和大小类。尺寸类不是自动实现的,因此您必须转换所有旧的情节提要板,这当然是有道理的,但对于现有应用程序来说,这对我来说太痛苦了。除此之外,我发现很容易用Size Classs搞砸了(等等,这个约束是安装在所有Sizes中还是仅安装在这个Sizes中?)。另外,字体大小对我来说已成为一个坏问题。可以这么说回到绘画板。

这是我最近开始做的事情。这是非常有效的,并且我相信会花费大致相同的初始工作,但是随后对UI的更改/调整非常迅速。


我摆脱了所有情节提要和Xibs。对。每一个单。一。我前一阵子读过this article。我讨厌它。我的意思是,这确实使我发疯。我以为,“这个家伙真是太蠢了!Interface Builder确实加快了我的开发周期!他一定做错了!”然后,我开始注意到对我的50多个屏幕的演示图板进行的任何调整只花了2-3分钟即可完成编译,仅用于测试,这开始困扰我。我曾考虑过将单个Storyboard拆分为多个,这确实加快了速度,但是屏幕尺寸的碎片仍然使UI设计和实现的难度超出了必要,因此我转储了所有Storyboard(当然,慢慢地,有条不紊地遵循了这些步骤的其余部分)。
我学会了喜欢用代码编写NSLayoutConstraint。我的意思是,不仅“不讨厌”它,而且要“爱”它!一旦开始大量使用它们,就很容易开发出某种模式,并且它们几乎最终会自己编写。另外,小心地复制和粘贴一个控件的约束并针对您在屏幕上布置的所有其他按钮进行调整非常容易。
现在,所有内容都在代码中进行了设置(顺便说一句,使推送新的UIViewController非常容易;现在,无论平台或屏幕大小如何,它总是总是与[[ViewController alloc] init]一样简单,并且可以解决休息!),我想出了一种对我有用的方法,可以将UI布局过程分为几部分。


我的基本UIViewController子类现在开始像这样的生活:

@implementation ViewController

#pragma mark -
#pragma mark - View Lifecycle
- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupUserInterface];
}

#pragma mark -
#pragma mark - UI Setup
- (void)setupUserInterface {
    [self createConstants];
    [self createControls];
    [self setupControls];
    [self layoutControls];
    // Optional
    [self setupNavigationBar];
}
- (void)createConstants {

}
- (void)createControls {

}
- (void)setupControls {

}
- (void)layoutControls {

}

#pragma mark - 
#pragma mark - Optional UI Setup
- (void)setupNavigationBar {

}
@end


然后,这是一个非常简单,直接的过程,用于定义将要在UI上进行哪些控件,控件的外观以及完成该控件所需的“常量”。例如,假设我有一个要布置的表格,有几个UITextFields,每个都有一个关联的UILabel。我可能具有以下属性(以及其他属性):

@property (assign, nonatomic) CGFloat  labelFontSize;
@property (assign, nonatomic) CGFloat  textFieldFontSize;
@property (strong, nonatomic) UIFont  *labelFont;
@property (strong, nonatomic) UIFont  *textFieldFontSize;


稍后,在-createConstants中,我可以根据运行应用程序的设备上的屏幕确定字体大小值,然后可以使用该值实例化适当的字体。这样,我可以在一个地方更改值,例如边距,控件间间距,字体大小,文本字段高度等。然后,进行更改就像更改数字一样简单,然后重新编译以测试我的新UI只需几秒钟(通常<10秒),而不是几分钟。

这种解决方案既提高了我的速度(由于减少了编译时间,又减少了进行实际更改的时间)和更好的控制(我发现更容易立即在代码中看到精确的像素精度,而不必单击控件) ,在检查器中单击,然后看到Xcode分配了一个任意值,或者我的视图最初偏离了4点,或类似的东西)。而且,这比传统的弹簧和支柱更好,因为它使相对于彼此的元素布局非常容易,而不必担心任何平台/屏幕上的确切框架尺寸,而不必担心所有这些元素。

例如:


假设我有一个相当简单的屏幕,带有一个标题标签和5个按钮。
我希望所有这些都堆叠在垂直列中。
我希望标签占用所需的空间。
我希望按钮占用剩余空间。
我希望按钮都具有相同的高度。


使用spring和struct,您必须做大量的数学运算才能在所有平台/屏幕上完成此操作。是的,您可以编写一个简单的方法来满足您的需要,但是使用自动版式甚至更容易。

这是我的操作方式(请记住,这是一种完全以代码为中心的方法):

- (void)layoutControls {
    [self.view addSubview:label];
    [self.view addSubview:button1];
    [self.view addSubview:button2];
    [self.view addSubview:button3];
    [self.view addSubview:button4];
    [self.view addSubview:button5];

    // Each of the 6 controls gets laid out horizontally with essentially
    // an identical version of this (where margin is a "constant" I've defined):
    [self.view addConstraints:
        [NSLayoutConstraints 
            constraintsWithVisualFormat:@"H:|-(margin)-[label]-(margin)-|"
                     options:0
                     metrics:@{@"margin": @(self.margin)}
                       views:@{@"label": self.label}
        ]
    ];

    // Once all are laid out horizontally, here's how to do the vertical layout
    [self.view addConstraints:
        [NSLayoutConstraints
            constraintsWithVisualFormat:@"V:|-(margin)-[label]-[button1]-[button2(==button1)]-[button3(==button1)]-[button4(==button1)]-[button5(==button1)]-(margin)-|"
                                options:0
                                metrics:@{@"margin": @(self.margin)}
                                  views:@{@"label": self.label,
                                          @"button1": self.button1,
                                          @"button2": self.button2,
                                          @"button3": self.button3, 
                                          @"button4": self.button4, 
                                          @"button5": self.button5}
        ]
    ];

}


就是这样。系统现在将为您计算所有精确的数学运算,并且“正常运行”!对我来说,这比弄清楚手动镜框要容易得多。另外,如果您决定以后添加或删除按钮,则可以通过自动布局轻松“修复”。

关于问题的第二部分(Android布局),我开始学习在Android上编写应用程序时,希望找到一种方法来实现类似的方法。

关于android - AutoLayout对处理iOS屏幕大小的 fragment 有用吗?为什么Android中没有等效的工具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26828121/

相关文章:

android - 如何在android中创建页面控件

java - 更改操作栏的颜色

android - 如何在android中创建火焰?

ios - 将 stackview 中的项目在水平轴上彼此靠近对齐

ios - 在 iOS 上无需按按钮即可进行语音命令

iphone - 如何在 UITableView 中定位无标题部分

android - Android Studio 版本 3.2 中未显示预览

Android应用控制流程?

android - React Native 0.57.7 - Android 构建在任务 :app:mergeReleaseResources 失败

android - 用户将标记放在任何地方,初始标记将消失