【问题标题】:Can't change UITableViewCell's subview's position不能改变 UITableViewCell 的子视图的位置
【发布时间】:2014-01-11 21:09:01
【问题描述】:

所以我有一个静态表格视图,我想更改标签在第一个表格视图单元中的位置。我有第一个单元格的 IBOutlet。

这是我尝试更改标签位置的方式:

UILabel *label1 = [tempTC.cell1.contentView.subviews firstObject];
label1.frame = CGRectMake(10, 10, 10, 10);

问题是框架没有改变,但是我可以对标签做任何其他事情,比如改变它的文本和大小等,但是改变框架似乎不起作用。

我有什么遗漏吗?

【问题讨论】:

  • 你在使用自动布局吗?
  • 这不是您引用 tableviewcell 的子视图并更改其框架的方式。可能在 tableview 的委托 tableView:cellForRowAtIndexPath 或 tableView:willDisplayCell:forRowAtIndexPath:.
  • 为什么不用标签?例如,您可以使用[cell viewWithTag:1] 引用它...
  • @rdelmar 我正在使用自动布局,是的,我没有禁用它。

标签: ios cocoa-touch uitableview


【解决方案1】:

当使用自动布局时,你应该设置框架,你应该改变约束。最简单的方法是将 IBOutlets 设置为您需要更改的内容,并更改约束的常量值。例如,如果您对左侧有一个名为 leftCon 的约束,您可以执行以下操作:

self.leftCon.constant = 30;

【讨论】:

  • 我们不能在不改变约束的情况下改变框架吗?
【解决方案2】:

当您想要更改框架子视图时,这些是 XIB 中的约束。你需要设置 translatesAutoresizingMaskIntoConstraints = YES。

label1.translatesAutoresizingMaskIntoConstraints = YES;
label1.frame = CGRectMake(10, 10, 10, 10);

详情: Can I use setFrame and autolayout on the same view?

【讨论】:

    【解决方案3】:

    首先根据cmets,禁用自动布局。 其次,如果你想参考 textLabel 使用[[UITableViewCell textLabel] setFrame:CGRectMake(10,10,10,10)];

    顺便说一句。如果你的第一个UITablViewCell 很特别,我建议使用.xib 和子类UITableviewCell。将该子类应用于情节提要中的原型UITableViewCell,然后将此单元原型单元添加为属性/全局变量。

    如果您需要更多描述,请询问:)。

    【讨论】:

      【解决方案4】:

      制作一个自定义 UITableViewCell。

      看下面的例子。 在 tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) 方法中我正在动态更改 TimeStatus (UIView) 帧大小:

      .
      .
      .
      let cell:OneTVChannelTableViewCell = tableView.dequeueReusableCellWithIdentifier(OneCurrentChannelTCIdentifier, forIndexPath: indexPath) as OneTVChannelTableViewCell
      .
      .
      .
      cell.setForRepairDynamicViewWidth(channelTimeStatusWidth)
      .
      .
      .
      

      这是我的简单自定义 UITableViewCell:

      class OneTVChannelTableViewCell: UITableViewCell {
      
      @IBOutlet weak var Number: UILabel!
      @IBOutlet weak var Image: UIImageView!
      @IBOutlet weak var Title: UILabel!
      @IBOutlet weak var TimeStatus: UIView!
      @IBOutlet weak var TimeBack: UIView!
      
      var RepairWidth:CGFloat = 0.0
      
      override func awakeFromNib() {
          super.awakeFromNib()
          // Initialization code
      }
      
      override func setSelected(selected: Bool, animated: Bool) {
          super.setSelected(selected, animated: animated)
      
          // Configure the view for the selected state
      }
      
      override func layoutSubviews() {
          super.layoutSubviews()
      
          TimeStatus.frame.size.width = RepairWidth
      }
      
      func setForRepairDynamicViewWidth(width:CGFloat)
      {
          RepairWidth = width
      }  
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多