【问题标题】:IOS/Autolayout/Objective-C: Create Constraint in Code that References Element in StoryboardIOS/Autolayout/Objective-C:在引用情节提要中的元素的代码中创建约束
【发布时间】:2018-01-03 21:25:13
【问题描述】:

我正在代码中创建一个表格视图,并希望使用自动布局将其放置在故事板屏幕上最低元素的正下方。最下方元素的位置会根据屏幕上元素的内容而有所不同——这要归功于自动布局。

是否有办法从情节提要中获取一个具有出口的元素并使用代码对其创建约束?

这就是我创建表格的方式:

_myTableView = [[UITableView alloc] initWithFrame:
                              CGRectMake(20, 714, 280, 200) style:UITableViewStylePlain];
    _myTableView.delegate = self;
    _myTableView.dataSource = self;
    _myTableView.scrollEnabled = NO;
    _myTableView.layer.cornerRadius = 5;
    _myTableView.backgroundColor = [UIColor whiteColor];
    _myTableView.rowHeight=28;
    [self.scrollView addSubview:_myTableView]; 

这就是我通常在代码中创建约束的方式:

 NSLayoutConstraint *tableToBottomElement = [NSLayoutConstraint 
constraintWithItem:_myTableView attribute:NSLayoutAttributeTop 
relatedBy:NSLayoutRelationEqual toItem:self.bottomElement 
attribute:NSLayoutAttributeBottom multiplier:1 constant:12];

基本上我希望表格视图出现在底部元素下方 12 点处。

但是,在创建约束后,它显示为未使用的变量。我如何让 tableview 适应这个约束?有没有办法让表格最初出现在正确的位置?

【问题讨论】:

  • 您需要在创建视图后将约束添加到视图中。只要您创建约束并将其添加到viewDidLoad 中,表格就会出现在正确的位置。
  • 是否需要将约束设置为.isActive?或者你如何打开它,使它不再给出未使用的变量警告。
  • 您需要激活它developer.apple.com/documentation/appkit/nslayoutconstraint/… 此外,您需要在表格视图中将translatesAutoResizingMaskIntoConstraints 设置为false。

标签: ios autolayout


【解决方案1】:

如果底部元素在scollview的最底端,别忘了去掉最底部的约束,把tableview挂到它上面,把tableview的底部挂到scrollview上

   -(void)viewDidLayoutSubviews
   {
      if(once){

      _myTableView.translatesAutoresizingMaskIntoConstraints = NO;

      NSLayoutConstraint *con1 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeTop 
      relatedBy:NSLayoutRelationEqual toItem:self.bottomElement 
      attribute:NSLayoutAttributeBottom multiplier:1 constant:12];

     NSLayoutConstraint *con2 = [NSLayoutConstraint 
     constraintWithItem:_myTableView attribute:NSLayoutAttributeTrailing 
     relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
     attribute:NSLayoutAttributeTrailing multiplier:1 constant:0];

      NSLayoutConstraint *con3 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeLeading
      relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
      attribute:NSLayoutAttributeLeading multiplier:1 constant:0];

      NSLayoutConstraint *con4 = [NSLayoutConstraint 
      constraintWithItem:_myTableView attribute:NSLayoutAttributeBottom 
      relatedBy:NSLayoutRelationEqual toItem:self.scrollView  
      attribute:NSLayoutAttributeBottom multiplier:1 constant:0];

      [self.scrollView  addConstraints:@[con1,con2,con3,con4]];

      [self.view layoutIfNeeded];

      once = NO;

      }

   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 2019-12-17
    • 2017-03-26
    • 1970-01-01
    • 2020-02-12
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多