我有一个自定义单元格(UITableViewCell的子类),并且其中有一些UITextField我想选择其在单元格中的相对位置。

所以我的代码类似于:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSInteger offset = 230;
        UITextField *myTextField = [[UITextField alloc] initWithFrame:CGRectMake(offset, 10, 95, 30)];
        [self.contentView addSubview:myTextField];
    }
    return self;
}


现在我的问题是,这在纵向模式下可以正常工作,但在横向模式下,我想调整偏移量以模拟文本框的右对齐。同样,我希望能够调整iPad

如何获取当前的单元格宽度?

我尝试使用self.contentView.frame.size.widthself.contentView.bounds.size.width,但两者始终返回320。

我知道这听起来像是一个已经被问过数千次的问题,但是我什么也没发现……

注意:我知道重复使用单元格会遇到一些问题,但是我还没有到此为止。

最佳答案

UITableViewCell的默认大小取决于xib(storyboard),如果它是从xib或情节提要中初始化的。

如果您的单元格是从这样的代码初始化的:

[tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]


因此,您的单元将首先被初始化(无论是iphone还是ipad,其大小始终为(320.0, 44.0)),然后进行大小调整。

因此,当width的大小更改时,您必须调整myTextFieldCell

有3个解决方案:

使用自动版式:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UITextField *myTextField = [[UITextField alloc] init];
        [self.contentView addSubview:myTextField];

        myTextField.translatesAutoresizingMaskIntoConstraints = NO;
        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-10-[textField(==30)]"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                          views:@{@"textField" : myTextField}]];

        [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[textField(==95)]-0-|"
                                                                        options:NSLayoutFormatDirectionLeadingToTrailing
                                                                        metrics:nil
                                                                          views:@{@"textField" : myTextField}]];
    }

    return self;
}


使用autoresizingMask就像@jpulikkottil所说的那样:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        NSInteger offset = 230;
        UITextField *myTextField = [[UITextField alloc] initWithFrame:CGRectMake(offset, 10, 95, 30)];
        [self.contentView addSubview:myTextField];
        mytextfield.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
    }
    return self;
}


使用layoutSubviews

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UITextField *myTextField = [[UITextField alloc] init];
        self.myTextField = myTextField;
        [self.contentView addSubview:myTextField];
    }
    return self;
}

- (void)layoutSubviews {
    [super layoutSubviews];

    NSInteger offset = self.contentView.bounds.size.width - 95;
    self.myTextField.frame = CGRectMake(offset, 10, 95, 30);
}

关于ios - 获取UITableViewCell的当前宽度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31018112/

10-10 14:56