<small id='AqU2B'></small><noframes id='AqU2B'>

      <legend id='AqU2B'><style id='AqU2B'><dir id='AqU2B'><q id='AqU2B'></q></dir></style></legend>
    1. <tfoot id='AqU2B'></tfoot>

          <bdo id='AqU2B'></bdo><ul id='AqU2B'></ul>

      1. <i id='AqU2B'><tr id='AqU2B'><dt id='AqU2B'><q id='AqU2B'><span id='AqU2B'><b id='AqU2B'><form id='AqU2B'><ins id='AqU2B'></ins><ul id='AqU2B'></ul><sub id='AqU2B'></sub></form><legend id='AqU2B'></legend><bdo id='AqU2B'><pre id='AqU2B'><center id='AqU2B'></center></pre></bdo></b><th id='AqU2B'></th></span></q></dt></tr></i><div id='AqU2B'><tfoot id='AqU2B'></tfoot><dl id='AqU2B'><fieldset id='AqU2B'></fieldset></dl></div>

        如何调整超级视图的大小以适应所有具有自动布局的子视图?

        时间:2023-09-13
        <tfoot id='MDGCQ'></tfoot>
        <i id='MDGCQ'><tr id='MDGCQ'><dt id='MDGCQ'><q id='MDGCQ'><span id='MDGCQ'><b id='MDGCQ'><form id='MDGCQ'><ins id='MDGCQ'></ins><ul id='MDGCQ'></ul><sub id='MDGCQ'></sub></form><legend id='MDGCQ'></legend><bdo id='MDGCQ'><pre id='MDGCQ'><center id='MDGCQ'></center></pre></bdo></b><th id='MDGCQ'></th></span></q></dt></tr></i><div id='MDGCQ'><tfoot id='MDGCQ'></tfoot><dl id='MDGCQ'><fieldset id='MDGCQ'></fieldset></dl></div>

              1. <small id='MDGCQ'></small><noframes id='MDGCQ'>

                  <tbody id='MDGCQ'></tbody>
                  <bdo id='MDGCQ'></bdo><ul id='MDGCQ'></ul>
                  <legend id='MDGCQ'><style id='MDGCQ'><dir id='MDGCQ'><q id='MDGCQ'></q></dir></style></legend>
                  本文介绍了如何调整超级视图的大小以适应所有具有自动布局的子视图?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                  问题描述

                  我对自动布局的理解是,它采用超级视图的大小,并根据约束和内在大小计算子视图的位置.

                  My understanding of autolayout is that it takes the size of superview and base on constrains and intrinsic sizes it calculates positions of subviews.

                  有没有办法扭转这个过程?我想根据约束和内在大小调整超级视图的大小.实现这一目标的最简单方法是什么?

                  Is there a way to reverse this process? I want to resize superview on the base of constrains and intrinsic sizes. What is the simplest way of achieving this?

                  我在 Xcode 中设计了视图,用作 UITableView 的标题.该视图包括一个标签和一个按钮.标签的大小因数据而异.根据约束,标签成功按下按钮,或者如果按钮和超级视图底部之间存在约束,则标签被压缩.

                  I have view designed in Xcode which I use as a header for UITableView. This view includes a label and a button. Size of the label differs depending on data. Depending on constrains the label successfully pushes the button down or if there is a constrain between the button and bottom of superview the label is compressed.

                  我发现了一些类似的问题,但它们没有很好且简单的答案.

                  I have found a few similar questions but they don’t have good and easy answers.

                  推荐答案

                  正确使用的 API 是 UIView systemLayoutSizeFittingSize:,传递 UILayoutFittingCompressedSizeUILayoutFittingExpandedSize.

                  The correct API to use is UIView systemLayoutSizeFittingSize:, passing either UILayoutFittingCompressedSize or UILayoutFittingExpandedSize.

                  对于使用自动布局的普通 UIView,只要您的约束是正确的,这应该可以工作.如果您想在 UITableViewCell 上使用它(例如确定行高),那么您应该针对您的单元格 contentView 调用它并获取高度.

                  For a normal UIView using autolayout this should just work as long as your constraints are correct. If you want to use it on a UITableViewCell (to determine row height for example) then you should call it against your cell contentView and grab the height.

                  如果您的视图中有一个或多个 UILabel 是多行的,则需要进一步考虑.对于这些,必须正确设置 preferredMaxLayoutWidth 属性,以便标签提供正确的 intrinsicContentSize,这将用于 systemLayoutSizeFittingSize 的 计算.

                  Further considerations exist if you have one or more UILabel's in your view that are multiline. For these it is imperitive that the preferredMaxLayoutWidth property be set correctly such that the label provides a correct intrinsicContentSize, which will be used in systemLayoutSizeFittingSize's calculation.

                  根据要求,为表格视图单元格添加高度计算示例

                  使用自动布局计算表格单元格的高度不是很高效,但确实很方便,尤其是在您的单元格布局复杂的情况下.

                  Using autolayout for table-cell height calculation isn't super efficient but it sure is convenient, especially if you have a cell that has a complex layout.

                  如上所述,如果您使用多行 UILabel,则必须将 preferredMaxLayoutWidth 同步到标签宽度.我使用自定义 UILabel 子类来执行此操作:

                  As I said above, if you're using a multiline UILabel it's imperative to sync the preferredMaxLayoutWidth to the label width. I use a custom UILabel subclass to do this:

                  @implementation TSLabel
                  
                  - (void) layoutSubviews
                  {
                      [super layoutSubviews];
                  
                      if ( self.numberOfLines == 0 )
                      {
                          if ( self.preferredMaxLayoutWidth != self.frame.size.width )
                          {
                              self.preferredMaxLayoutWidth = self.frame.size.width;
                              [self setNeedsUpdateConstraints];
                          }
                      }
                  }
                  
                  - (CGSize) intrinsicContentSize
                  {
                      CGSize s = [super intrinsicContentSize];
                  
                      if ( self.numberOfLines == 0 )
                      {
                          // found out that sometimes intrinsicContentSize is 1pt too short!
                          s.height += 1;
                      }
                  
                      return s;
                  }
                  
                  @end
                  

                  这是一个人为的 UITableViewController 子类,展示了 heightForRowAtIndexPath:

                  Here's a contrived UITableViewController subclass demonstrating heightForRowAtIndexPath:

                  #import "TSTableViewController.h"
                  #import "TSTableViewCell.h"
                  
                  @implementation TSTableViewController
                  
                  - (NSString*) cellText
                  {
                      return @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
                  }
                  
                  #pragma mark - Table view data source
                  
                  - (NSInteger) numberOfSectionsInTableView: (UITableView *) tableView
                  {
                      return 1;
                  }
                  
                  - (NSInteger) tableView: (UITableView *)tableView numberOfRowsInSection: (NSInteger) section
                  {
                      return 1;
                  }
                  
                  - (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath
                  {
                      static TSTableViewCell *sizingCell;
                      static dispatch_once_t onceToken;
                      dispatch_once(&onceToken, ^{
                  
                          sizingCell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell"];
                      });
                  
                      // configure the cell
                      sizingCell.text = self.cellText;
                  
                      // force layout
                      [sizingCell setNeedsLayout];
                      [sizingCell layoutIfNeeded];
                  
                      // get the fitting size
                      CGSize s = [sizingCell.contentView systemLayoutSizeFittingSize: UILayoutFittingCompressedSize];
                      NSLog( @"fittingSize: %@", NSStringFromCGSize( s ));
                  
                      return s.height;
                  }
                  
                  - (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
                  {
                      TSTableViewCell *cell = (TSTableViewCell*)[tableView dequeueReusableCellWithIdentifier: @"TSTableViewCell" ];
                  
                      cell.text = self.cellText;
                  
                      return cell;
                  }
                  
                  @end
                  

                  一个简单的自定义单元格:

                  A simple custom cell:

                  #import "TSTableViewCell.h"
                  #import "TSLabel.h"
                  
                  @implementation TSTableViewCell
                  {
                      IBOutlet TSLabel* _label;
                  }
                  
                  - (void) setText: (NSString *) text
                  {
                      _label.text = text;
                  }
                  
                  @end
                  

                  还有,这是故事板中定义的约束的图片.请注意,标签上没有高度/宽度限制 - 这些是从标签的 intrinsicContentSize 推断出来的:

                  And, here's a picture of the constraints defined in the Storyboard. Note that there are no height/width constraints on the label - those are inferred from the label's intrinsicContentSize:

                  这篇关于如何调整超级视图的大小以适应所有具有自动布局的子视图?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                  • <bdo id='yGXbT'></bdo><ul id='yGXbT'></ul>

                    1. <small id='yGXbT'></small><noframes id='yGXbT'>

                      <legend id='yGXbT'><style id='yGXbT'><dir id='yGXbT'><q id='yGXbT'></q></dir></style></legend>
                    2. <tfoot id='yGXbT'></tfoot>

                        <tbody id='yGXbT'></tbody>

                          <i id='yGXbT'><tr id='yGXbT'><dt id='yGXbT'><q id='yGXbT'><span id='yGXbT'><b id='yGXbT'><form id='yGXbT'><ins id='yGXbT'></ins><ul id='yGXbT'></ul><sub id='yGXbT'></sub></form><legend id='yGXbT'></legend><bdo id='yGXbT'><pre id='yGXbT'><center id='yGXbT'></center></pre></bdo></b><th id='yGXbT'></th></span></q></dt></tr></i><div id='yGXbT'><tfoot id='yGXbT'></tfoot><dl id='yGXbT'><fieldset id='yGXbT'></fieldset></dl></div>