如何更改tableView单元格textLabel的宽度

时间:2016-04-20 10:10:26

标签: ios objective-c xcode uitableview

我想在左侧和右侧添加2个imageViews,在TableView上的中心添加一个单元格textLabel。

2个imageViews具有不同的角色和动作。 (能够触摸,隐藏而不是隐藏)

现在左侧的imageView位于中心textLabel的顶部。 所以我想将textLabel的宽度和x位置更改为不在imageViews的顶部。

我试过这段代码,但它没有用。

CGRect frame = CGRectMake(40, 0, 200, 40);
cell.textLabel.frame =  frame;

我还尝试在tableView上添加UILabel。 但是我将实现TableViewCell动画,如果我添加UILabel,它就不起作用了。 所以我不会这样使用。

我该如何解决?

这是代码。

- (void)viewDidLoad {

    tableView = [[UITableView alloc]initWithFrame:rect style:UITableViewStylePlain];
    tableView.delegate = self;
    tableView.dataSource = self;

    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    [self.view addSubview: self.tableView];
    self.tableView.backgroundColor = [UIColor clearColor];
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    [self updateCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)updateCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{

    NSMutableArray *set = [self.section objectAtIndex:indexPath.row];
    cell.backgroundColor = [UIColor blueColor];
    cell.textLabel.textColor = [UIColor blackColor];
    cell.textLabel.font = [UIFont fontWithName:@"HiraKakuProN-W3" size:15];
    cell.textLabel.adjustsFontSizeToFitWidth = YES;
    cell.textLabel.minimumScaleFactor = 10.0f;
    cell.textLabel.numberOfLines = 0;
}

4 个答案:

答案 0 :(得分:2)

您需要覆盖UItableviewCell类的layoutSubviews

- (void)layoutSubviews {
[super layoutSubviews];

CGSize size = self.bounds.size;
self.textLabel.frame =   CGRectMake(2.0f, 4.0f, size.width, size.height);  // or customize 
self.textLabel.contentMode = UIViewContentModeScaleAspectFit;
}

<强>选择-2

将UILabel和子视图设置为cell.contentView

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 200, 30)];
label.text = @"Test";
[cell.contentView addSubview:label];

<强>更新

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
[self updateCell:cell atIndexPath:indexPath];



  if (cell == nil){
        myCellView = [[UITableViewCell alloc]
                      initWithStyle:UITableViewCellStyleDefault
                      reuseIdentifier:@"Cell"];

        UILabel *orderLbl = [[UILabel alloc] initWithFrame:CGRectMake(1, 13, 176, 21)];
        [orderLbl setTag:1];
        orderLbl.textColor = [UIColor whiteColor];
        [orderLbl setBackgroundColor:[UIColor clearColor]];
        [orderLbl setTextAlignment:NSTextAlignmentCenter];

        [cell.contentView addSubview:orderLbl];
  }

        [(UILabel *)[cell.contentView viewWithTag:1] setText:[NSString stringWithFormat:@"test"]];
      return cell;
  }

答案 1 :(得分:0)

更好的是,您可以将自定义文本标签与您所需的帧要求一起使用。

为textlabel添加标签,并在cellForRowAtIndexPath中找到标签,如下所示:

UILabel *myLabel = (UILabel *)[cell.contentView viewWithTag:givenTagValue];

然后根据需要对此标签应用所需的行为。

希望有所帮助......

答案 2 :(得分:0)

在这种情况下,我更喜欢创建自定义子类并应用我想要的布局,所以如果我收到任何自动布局警告我总是知道它是因为布局不正确。

答案 3 :(得分:0)

实际上,在TableView中不允许更改框架中单元格中的textLabel。每个单元格的文本标签的框架宽度与单元格有关,开发人员无法以编程方式对其进行设置。但是,我找到了一个可行的解决方案:我们可能不会更改textLabel的框架,但我们可能会改变源文本。如果我们可以提前截断源字符串,就可以解决这个问题。

//在表视图中将数组中的每个元素分配一行

func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - &gt; UITableViewCell {

    var myCell = myTableView.dequeueReusableCell(withIdentifier: "The Cell")

    if myCell == nil {
        myCell = UITableViewCell(style: UITableViewCellStyle.value1, reuseIdentifier: "The Cell")
    }

    myCell?.accessoryType = UITableViewCellAccessoryType.none

    // If the text is too long (longer than 25 chars), the text will be truncated
    // The lenght of label cannot be set effectively here, so I truncate the source string alternatively
    var myString: String = sectionArray[indexPath.row]
    if myString.characters.count > 25 {

        let myIndex = myString.index(myString.startIndex, offsetBy: 25)
        myString = myString.substring(to: myIndex)
        myString += "..."
    }

    myCell?.textLabel?.text = myString
    myCell?.detailTextLabel?.text = "\(NSDate())"

    return myCell!
}

支持工作。