标签: autolayout

iOS等效于Android View.GONE可见性模式

我正在为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)

iphone visibility interface-builder ios autolayout

77
推荐指数
6
解决办法
3万
查看次数

Xcode 11 添加新的约束设置为零:使用设置值而不是默认/标准

我曾经使用自动布局添加新约束来对超级视图/相对视图进行简单约束,如下所示(对于 loooong 时间):

在此处输入图片说明

但是,最近更新到最新的 xcode(11.3.3 或 11.3/11C29)后,我遇到了这个奇怪的问题:当我设置常量 = 0 时,它们总是以不需要的方式生成约束,如下所示:

在此处输入图片说明

似乎默认值在某种程度上是 20 并且让我的观点看起来如此错误(0 与 20 相比?)

如果我通过像这样编辑约束来解决这个问题:

在此处输入图片说明

然后它会再次更正(图像是在编辑约束之后,在编辑之前显示常量 = Standard

我什至不知道如何描述这个问题,但是我如何解决这个新问题add new constraint以使用我的愿望点而不是标准/默认值?

更新:

它似乎只发生在约束超级视图时。不知道如何修复tho。

2020 年 4 月 1 日更新:

Xcode11.4 修复了这个问题。

xcode interface-builder autolayout xcode11 xcode11.3

77
推荐指数
5
解决办法
8681
查看次数

UIScrollView不使用自动布局约束

我有一个滚动视图和背后的图像视图,我用笔尖填充它.我正在使用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)

constraints objective-c uiscrollview autolayout

76
推荐指数
2
解决办法
8万
查看次数

在Xcode 5中为superview添加间距约束

我正在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.它可以工作,但它仍然不是解决方案,因为它需要调整视图大小,连接,再次调整大小和更新约束.

xcode interface-builder ios autolayout xcode5

74
推荐指数
2
解决办法
5万
查看次数

在故事板中重用uiview xib

我通常喜欢在界面构建器中创建和设计我的uiviews.有时我需要在xib中创建一个可以在故事板中的多个视图控制器中重用的视图.

interface-builder xib uiview uistoryboard autolayout

74
推荐指数
4
解决办法
3万
查看次数

CALayer IOS上的自动布局约束

嗨,我正在开发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项目设置一些约束.但我不知道该怎么做.有人知道吗?需要帮忙.谢谢.

calayer ios autolayout

73
推荐指数
5
解决办法
4万
查看次数

以编程方式添加CenterX/CenterY约束

我有一个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)

xcode ios autolayout nslayoutconstraint swift

73
推荐指数
5
解决办法
8万
查看次数

如何在iOS 7中以编程方式设置设备方向?

我正在使用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希望将设备方向放在用户手中.但是,我希望能够在不进行"抬头"模式时支持横向模式.

我错过了能够强制改变方向的东西吗?

xcode autorotate ios autolayout ios7

71
推荐指数
4
解决办法
10万
查看次数

删除所有影响UIView的约束

我有一个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或一些人的变种.这些解决方案不起作用,因为这些方法只返回视图所拥有的约束,而不是影响视图的约束.

要澄清这些解决方案的问题,请考虑以下视图层次结构:

  • 祖父
    • 父亲
        • 儿子
        • 女儿
      • 哥哥
    • 叔叔

现在假设我们创建了以下约束,并始终将它们附加到最近的共同祖先:

  • C0:我:和儿子一样(由我拥有)
  • C1:我:宽度= 100(由我拥有)
  • C2:我:和兄弟一样高(由父亲拥有)
  • C3:我:和叔叔一样(由祖父拥有)
  • C4:我:和祖父一样(由祖父拥有)
  • C5:兄弟:和父亲一样(由父亲拥有)
  • C6:叔叔:和祖父一样(由祖父拥有)
  • C7:儿子:和女儿一样(由我拥有)

现在假设我们要删除所有影响的约束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].同样,我们无法删除所有这些,因为 …

constraints objective-c uiview ios autolayout

71
推荐指数
6
解决办法
8万
查看次数

自动布局(约束)中心2在父视图中并排显示

我试图弄清楚如何使用自动布局(iOS6)和约束来做到这一点.

基本上我将我的大视图分为底部的两个部分.在这些部分(目前是子视图)内部,我有一个图像视图和一个标签.我希望以两边为中心,使用可变长度的文本.

我的头脑主要是围绕汽车布局,但我不确定最好的方法.我倾向于认为这在IB中是不可能的,但是在代码中.

继续尝试解决这个问题,但与此同时,我正在努力创建这个例子.

在此输入图像描述

iphone constraints ios autolayout

69
推荐指数
6
解决办法
6万
查看次数