我曾经能够这样做:
UIButton *bigBottomBtn=[[UIButton alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-60, self.view.frame.size.width, 60)];
我以前也只能将一个按钮拖到一个故事板上,并添加一个约束,将其保存在父级的底部。
Xcode,Autolayout和Apple发生了什么事......我的Xcode无法正常工作?我错过了一份重要的备忘录吗?苹果公司刚刚快速走下坡路?
答案 0 :(得分:1)
您创建按钮时,您的按钮创建代码曾用于(并且仍然可以)如果 self.view
的框架是正确的。请注意,视图不一定来自具有正确框架的xib或storyboard; xib / storyboard包含某些设计大小的视图,该视图可能与当前设备不匹配。当所有iPhone都有3.5英寸屏幕时,这并不是一个问题,但随着iPhone 5的4英寸屏幕的出现,这成为一个非常普遍的问题。
在超级视图layoutSubviews
返回之前,视图无法保证其帧正确,因此,如果您在bigBottomBtn
中创建viewDidLoad
,则为时过早。 Many questions on stackoverflow解决了这个问题。您需要设置按钮的autoresizingMask
,或者实施layoutSubviews
或viewDidLayoutSubviews
来更新按钮的框架,或者关闭translatesAutoresizingMaskIntoConstraints
并安装约束。另请注意,如果您支持旋转,滑过或拆分视图多任务处理,或者如果您的视图可以是UISplitViewController
的详细视图,那么您的视图可以更改大小,因此尝试猜测正确的框架是个坏主意。在创建按钮时,该按钮基于设备的屏幕尺寸。
请注意,默认情况下,故事板现在使用600x600的设计尺寸,这不是任何设备的尺寸。这可能是因为如果Apple选择某些设备的尺寸(例如,iPhone 5的320x568)作为默认设置,并且您碰巧使用这种尺寸的设备作为主要(或唯一)测试设备,您可能很容易忘记考虑什么你的应用程序看起来像其他尺寸。但是,如果需要,可以将设计大小明确设置为某个设备的大小:
如果我不需要更大的东西,我通常会使用“iPhone 3.5英寸”,因为它可以让我同时获得屏幕上最多的场景(并为stackoverflow生成最小的屏幕截图)。
至于“我以前只能将一个按钮拖到故事板上并添加一个将其保持在父母底部的约束”,我有个好消息:你仍然可以。例如:
但是,如果您已使用表格视图填充根视图,则需要小心,因为在屏幕截图中就是这种情况。在这种情况下,您需要将按钮拖动到文档大纲,因为如果将其放在表视图上,Xcode将假定您希望它成为表视图标题:
尝试将表格视图标题固定在屏幕底部会很愚蠢。
至于编辑器>对齐菜单,我发现这些物品可能是神秘不活跃的,这令人沮丧。
但请注意,只有“水平容器”和“垂直容器”才能工作(当它们完全工作时),并且选择了一个视图。要使用菜单中的其他项目,您需要至少选择两个视图,因为其他项目通过设置框架将所选视图彼此对齐:
如果您只选择了一个视图,Xcode就不知道您可能希望将其与哪个视图对齐。
这些菜单项在spring'n'struts模型中可能很有用,但是它们不会添加约束,并且在autolayout下你可能需要约束来在运行时强制对齐。
据我所知,这些菜单项从未添加过约束,但我不打算重新安装Xcode 6来验证,因为有一个方便的popover会添加对应于所有这些菜单项的约束:
答案 1 :(得分:0)