当前位置: 首页 > 知识库问答 >
问题:

使用自动布局约束时,如何获取视图的当前宽度和高度?

岳玉堂
2023-03-14

我不是在说框架属性,因为你只能从xib中获得视图的大小。我是在说视图因为它的约束而调整大小的时候(可能是在旋转之后,或者响应一个事件)。有没有办法得到它当前的宽度和高度?

我尝试遍历它的约束来寻找宽度和高度约束,但是这不是很干净,并且当有内在约束时会失败(因为我不能区分这两者)。此外,这只有在它们实际上有宽度和高度约束的情况下才起作用,如果它们依赖其他约束来调整大小,它们就没有宽度和高度约束。

为什么这对我来说这么难。ARG!

共有3个答案

长孙知
2023-03-14

对于那些可能仍然面临此类问题的人,尤其是TableviewCell。

只需覆盖方法:

-(void)layoutSubviews
{
//your code here like drawing a shadow
}

在UITableViewCell或UICollectionViewCell的情况下,创建单元格的子类并覆盖相同的方法:

-(void)layoutSubviews
{
//your code here like drawing a shadow
}
宋经业
2023-03-14

我有一个类似的问题,我需要将顶部和底部边框添加到根据UIStoryboard中的约束设置调整大小的UITableView。我能够使用-(void)viewDidLayoutSubview访问更新的约束。这很有用,因此您不需要对视图进行子类化并覆盖其布局方法。

/*** SET TOP AND BOTTOM BORDERS ON TABLE VIEW ***/
- (void)addBorders
{
    CALayer *topBorder           = [CALayer layer];
    topBorder.frame              = CGRectMake(0.0f, self.tableView.frame.origin.y, 320.0f, 0.5f);
    topBorder.backgroundColor    = [UIColor redColor].CGColor;

    CALayer *bottomBorder        = [CALayer layer];
    bottomBorder.frame           = CGRectMake(0.0f, (self.tableView.frame.origin.y + self.tableView.frame.size.height), 320.0f, 0.5f);
    bottomBorder.backgroundColor = [UIColor redColor].CGColor;

    [self.view.layer addSublayer:topBorder];
    [self.view.layer addSublayer:bottomBorder];
}

/*** GET AUTORESIZED FRAME DIMENSIONS ***/
- (void)viewDidLayoutSubviews{
    [self addBorders];
}

如果不从viewDidLayoutSubview方法调用该方法,则只会正确绘制上边框,因为下边框位于屏幕外的某个位置。

长孙德惠
2023-03-14

答案是[view layoutIfNeed]

原因如下:

您仍然可以通过检查view.bounds.size.widthview.bounds.size.height(或框架,这是等效的,除非您正在使用view.transform)来获得视图的当前宽度和高度。

如果你想要的是现有约束隐含的宽度和高度,答案是不要手动检查约束,因为这需要你重新实现自动布局系统的整个约束求解逻辑,以便解释这些约束。相反,您应该做的只是让auto layout更新该布局,以便它解决约束并用正确的解决方案更新view.bounds的值,然后您检查view.bounds。

如何要求自动布局更新布局?如果希望自动布局在运行循环的下一轮更新布局,请调用[view setNeedsLayout]

但是,如果您希望它立即更新布局,以便您可以稍后在当前函数中或在运行循环开始前的另一个点立即访问新边界值,那么您需要调用[view setNeedsLayout][view layoutIfNeed]

你问了第二个问题:“如果我没有直接引用高度/宽度约束,我怎么能改变它?

如果在IB中创建约束,最好的解决方案是在视图控制器或视图中创建IBOutlet,这样您就可以直接引用它。如果在代码中创建了约束,那么在创建时应该保留内部弱属性中的引用。如果其他人创建了约束,则需要通过检查视图来找到它。constraints属性,可能还有整个视图层次结构,以及实现查找关键NSLayoutConstraint的逻辑。这可能是错误的方法,因为它还有效地要求您确定是哪个特定约束决定了边界大小,而不能保证这个问题有一个简单的答案。最终边界值可以是一个非常复杂的多约束系统的解决方案,具有多个优先级等,因此没有单个约束是最终值的“原因”。

 类似资料:
  • 我刚开始更彻底地使用AutoLayout,遇到了一个大问题: 我有一个视图,其中一些子视图附着在其顶部,一些子视图附着在其底部,因此当视图的高度发生变化时,子视图会相应地移动。根据用户的操作,子视图的高度可以更改(=其高度约束值更改),这可能会导致它们不再适合其父视图。 如何确定一组新的约束是否需要更改父视图的高度以适应其所有子视图?最好在我显示具有新约束的所有字段之前-我希望视图的高度同时改变。

  • 问题内容: 除了使用ImageIO.read来获取图像的高度和宽度外,还有其他方法吗? 因为我遇到了锁定线程的问题。 此错误仅在Sun应用服务器上发生,因此我怀疑这是Sun错误。 问题答案: 这很简单方便。

  • 问题内容: 我有一个UILabel,一个UIView在情节提要中并排包含其他子视图。UIView应该紧靠UILabel的右边缘(跟踪约束为1),但我还需要UIlabel(左侧的UIlabel)将其宽度设置为等于其内容大小,除非它达到最大宽度。视觉上: |标签文字| | UIViewWithSubviews | 我需要以下约束: 1)标签应明智地调整宽度大小,除非达到最大大小,并且高度也是动态的,这

  • 我以前从未使用过自动布局约束。我有一个新的小应用程序,我正在开发,并注意到NIB的视图默认为自动布局。所以,我想我会借此机会使用它,并尝试弄清楚苹果公司在这方面的进展。 第一个挑战: 我需要调整MKMapView的大小,并将其设置为新位置的动画。如果我按照我习惯的方式来做: ...然后,每当更新同级视图时,MKMapView将“捕捉”回其原始高度(在我的例子中,UISegmentedControl

  • 我正在尝试创建一个 UITableViewCell,其中包含 3 个子视图 - 一个按钮和两个标签。表视图单元格应如下所示: 目前,我有一个按钮1,它的前导、顶部、宽度和高度约束将其固定在左上角。标签1有一个从按钮、顶部、左侧和底部约束到内容视图的前导约束。标签1的行数设置为0,并且可以动态扩展,到目前为止,这是可行的。 我很难弄清楚如何为标签2设置约束,以便它始终低于标签1并且可以扩展。 我尝试