我正在为iOS开发一个应用程序,我正在使用带有AutoLayout ON的Storyboard.我的一个视图控制器有一组4个按钮,在某些情况下我想让第一个按钮消失.
如果我使用该setHidden:TRUE方法,UIButton变得不可见,但它仍然显然在视图中占用空间,结果是一个"洞",我无法填充,使剩余的UIButton浮动到主视图的顶部.
在Android中,我会简单地使用View.GONE而不是View.INVISIBLE,但在iOS中我坚持这种行为,我不想相信唯一的解决方案是手动(是的,我的意思是以编程方式)将剩余的元素移动到顶部.
我以为我能够设置某种约束来使一切像Android一样自动,但我没有运气.
在我关闭Autolayout之前,有人能指出我正确的方向吗?
我正在使用IB,但我对程序化的东西也很满意.
更新:
将组件高度设置为0也没有用.
我试过这样的事情:
UIButton *b;
CGRect frameRect = b.frame;
frameRect.size.height = 0;
b.frame = frameRect;
Run Code Online (Sandbox Code Playgroud) 我曾经使用自动布局添加新约束来对超级视图/相对视图进行简单约束,如下所示(对于 loooong 时间):
但是,最近更新到最新的 xcode(11.3.3 或 11.3/11C29)后,我遇到了这个奇怪的问题:当我设置常量 = 0 时,它们总是以不需要的方式生成约束,如下所示:
似乎默认值在某种程度上是 20 并且让我的观点看起来如此错误(0 与 20 相比?)
如果我通过像这样编辑约束来解决这个问题:
然后它会再次更正(图像是在编辑约束之后,在编辑之前显示常量 = Standard)
我什至不知道如何描述这个问题,但是我如何解决这个新问题add new constraint以使用我的愿望点而不是标准/默认值?
更新:
它似乎只发生在约束超级视图时。不知道如何修复tho。
2020 年 4 月 1 日更新:
Xcode11.4 修复了这个问题。
我有一个滚动视图和背后的图像视图,我用笔尖填充它.我正在使用autolayout.我有一个底层空间可以看到超级视图,还有一个顶层空间可以在两个视图上进行超视图.图像视图完全符合我的要求.对于iphone 5来说,它就是我想要它的地方.而对于其他iphone,它保持在屏幕底部之上,因此它可以正确调整大小.滚动视图在iphone 5上看起来是正确的,但在其他手机上它没有调整大小,所以它向下滚动到应用程序的视图下方.我在日志中收到这些消息:
2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this: (1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer
to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 …Run Code Online (Sandbox Code Playgroud) 我正在Xcode 5中构建一个iOS应用程序,我在添加布局约束时遇到了麻烦.在Xcode 4.x中,我可以将前导/尾随/顶部/底部空格添加到容器(superview)到任何UI元素.现在,我只有这个选项:

我想在我的文本视图中添加一个"底层空间到superview"约束.它说"间隔到最近邻居",但我不想为"最近邻居"创建约束,我在文本视图下面还有其他内容,我不想用它创建约束.如果我的文本视图下没有其他对象,则会正确地向容器添加约束.但是如果我尝试改变任何东西,那么一切都会变得混乱:我需要将所有视图移动到其他地方,然后添加约束,然后添加移动其他视图.如果我在文本视图和UI元素之间添加一个约束(在这种情况下是一个按钮),它就不起作用(一切似乎都正确:按钮对superview的底部有一个约束,而文本视图有一个垂直间距约束,按钮,并没有冲突的约束).UI元素以不同(3.5英寸)屏幕方向显示在屏幕边界之外.Interface Builder是否有错误,或者我遗漏了什么?当我可以正确设置所有内容时,当我调整界面构建器屏幕的大小时,我的控件似乎仍然不受限制,但在3.5英寸的模拟器/设备上正确显示.在Xcode 5中使用新的Interface Builder约束设计UI的"最佳实践"是什么?
更新:我在同一件事的另一个项目中遇到了更多麻烦.我正在尝试通过CTRL将我的控件拖到顶部布局指南的顶部布局指南顶部的顶部布局指南,并且它正试图将我的控件底部变为布局指南(约-470)这是没有任何意义的,因为控件应该在可变高度的屏幕中布局自己(例如常规和4英寸iPhone,以及未来可能的其他布局......),而不是控制我的控制顶部.以下是正在发生的事情的屏幕截图:

我在约束中得到这个:

我怎样才能让界面生成器对准顶视图顶端布局指南?
更新2:我找到了解决方法.我首先调整视图大小以降低其高度(因此它的顶部不会重叠或非常接近顶部布局指南)然后我按住CTRL并将其拖动到顶部布局指南.它似乎工作正常.连接后,我再次将视图调整为所需大小并选择Update Constraints.它可以工作,但它仍然不是解决方案,因为它需要调整视图大小,连接,再次调整大小和更新约束.
我通常喜欢在界面构建器中创建和设计我的uiviews.有时我需要在xib中创建一个可以在故事板中的多个视图控制器中重用的视图.
嗨,我正在开发iPhone应用程序,我试图为edittext设置一个边框.我是按照以下方式做到的:
int borderWidth = 1;
CALayer *leftBorder = [CALayer layer];
leftBorder.borderColor = [UIColor whiteColor].CGColor;
leftBorder.borderWidth = borderWidth;
leftBorder.frame = CGRectMake(0, textField.frame.size.height - borderWidth, textField
.frame.size.width, borderWidth);
[textField.layer addSublayer:leftBorder];
Run Code Online (Sandbox Code Playgroud)
我对IB中的edittext设置了一些约束,这样当我旋转设备时,它会根据它调整文本字段的宽度.我的问题是调整edittext的宽度而不是调整我为编辑文本设置的CALayer的宽度.所以我想我必须为我的CALayer项目设置一些约束.但我不知道该怎么做.有人知道吗?需要帮忙.谢谢.
我有一个UITableViewController,如果没有任何显示,它不会显示任何部分.我添加了一个标签,向用户表明此代码无法显示:
label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
self.tableView.addSubview(label)
Run Code Online (Sandbox Code Playgroud)
但现在,我希望它在水平和垂直方向上居中.通常,我会在屏幕截图中选择突出显示的两个选项(加上高度和宽度的选项):

我尝试了以下代码来添加约束但应用程序崩溃时出现错误:
label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)
label.addConstraint(xConstraint)
label.addConstraint(yConstraint)
Run Code Online (Sandbox Code Playgroud)
错误:
When added to a view, the constraint's items must be descendants of that view (or …Run Code Online (Sandbox Code Playgroud) 我正在使用AutoLayout在iPad应用程序上工作,如果用户启用某种模式("抬头"模式),我想只支持纵向(或纵向颠倒)方向,此外,如果设备在风景,我想自动切换到纵向模式.
在顶视图控制器中,我有以下内容:
- (NSUInteger) supportedInterfaceOrientations {
if (self.modeHeadsUp) {
return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
} else {
return UIInterfaceOrientationMaskAll;
}
}
- (BOOL) shouldAutorotate {
return TRUE;
}
Run Code Online (Sandbox Code Playgroud)
基于我在其他地方看到的答案,答案似乎是我应该使用"application setStatusBarOrientation".因此,在用户选择"抬头"模式的方法中,我包括:
UIApplication *application = [UIApplication sharedApplication];
[application setStatusBarOrientation:UIInterfaceOrientationPortrait
animated:YES];
Run Code Online (Sandbox Code Playgroud)
但是,这根本就没有做任何事情.虽然我可以物理移动设备以使其旋转为纵向,但它不会自动移动.
实际上,在运行上面的代码后尝试以横向模式尝试以编程方式设置方向时,当我使用以下代码查询应用程序"statusBarOrientation"时,它对于横向保持为"4":
UIApplication *application = [UIApplication sharedApplication];
int orientation = [application statusBarOrientation];
self.movesTextView.text = [NSString stringWithFormat:@"ORIENTATION %d", orientation];
Run Code Online (Sandbox Code Playgroud)
好像autolayout可能没有被setStatusBarOrientation触发,所以我试图在之后添加这个代码,没有效果:
[super updateViewConstraints];
[self.view updateConstraints];
Run Code Online (Sandbox Code Playgroud)
我意识到Apple希望将设备方向放在用户手中.但是,我希望能够在不进行"抬头"模式时支持横向模式.
我错过了能够强制改变方向的东西吗?
我有一个UIView,通过几个约束放在屏幕上.一些约束由superview拥有,其他约束由其他祖先拥有(例如,可能是UIViewController的view属性).
我想删除所有这些旧约束,并使用新约束将其置于新的位置.
如果不为每个约束创建一个IBOutlet并且必须记住哪个视图拥有所述约束,我该怎么做呢?
详细说明,天真的方法是为每个约束创建一堆IBOutlet,然后涉及调用代码,例如:
[viewA removeConstraint:self.myViewsLeftConstraint];
[viewB removeConstraint:self.myViewsTopConstraint];
[viewB removeConstraint:self.myViewsBottomConstraint];
[self.view removeConstraint:self.myViewsRightConstraint];
Run Code Online (Sandbox Code Playgroud)
这段代码的问题在于,即使在最简单的情况下,我也需要创建2个IBOutlet.对于复杂的布局,这可以轻松达到4或8个所需的IBOutlet.此外,我需要确保在正确的视图上调用我的删除约束的调用.例如,想象一下,myViewsLeftConstraint拥有viewA.如果我不小心打电话[self.view removeConstraint:self.myViewsLeftConstraint],什么都不会发生.
注意:方法constraintsAffectingLayoutForAxis看起来很有前景,但仅用于调试目的.
更新:很多我收到处理问题的答案self.constraints,self.superview.constraints或一些人的变种.这些解决方案不起作用,因为这些方法只返回视图所拥有的约束,而不是影响视图的约束.
要澄清这些解决方案的问题,请考虑以下视图层次结构:
现在假设我们创建了以下约束,并始终将它们附加到最近的共同祖先:
现在假设我们要删除所有影响的约束Me.任何适当的解决方案应该删除[C0,C1,C2,C3,C4],没有别
如果我使用self.constraints(自我就是我),我会得到[C0,C1,C7],因为这些是我拥有的唯一约束.显然,删除它是不够的,因为它丢失了[C2,C3,C4].此外,它正在C7不必要地删除.
如果我使用self.superview.constraints(自我就是我),我会得到[C2,C5],因为那些是父拥有的约束.显然我们无法删除所有这些因为C5完全无关Me.
如果我使用grandfather.constraints,我会得到[C3,C4,C6].同样,我们无法删除所有这些,因为 …
我试图弄清楚如何使用自动布局(iOS6)和约束来做到这一点.
基本上我将我的大视图分为底部的两个部分.在这些部分(目前是子视图)内部,我有一个图像视图和一个标签.我希望以两边为中心,使用可变长度的文本.
我的头脑主要是围绕汽车布局,但我不确定最好的方法.我倾向于认为这在IB中是不可能的,但是在代码中.
继续尝试解决这个问题,但与此同时,我正在努力创建这个例子.

autolayout ×10
ios ×7
xcode ×4
constraints ×3
iphone ×2
objective-c ×2
uiview ×2
autorotate ×1
calayer ×1
ios7 ×1
swift ×1
uiscrollview ×1
uistoryboard ×1
visibility ×1
xcode11 ×1
xcode11.3 ×1
xcode5 ×1
xib ×1