获取UITableViewCell的当前宽度

vib*_*vib 0 uitableview ios

我有一个自定义单元格(子类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;
}
Run Code Online (Sandbox Code Playgroud)

现在我的问题是这在纵向模式下工作正常但在横向模式下我想调整偏移量来模拟我的文本字段的右对齐.同样,我希望能够调整一个iPad.

如何获得当前的细胞宽度?

我试图使用self.contentView.frame.size.width,self.contentView.bounds.size.width但两者总是返回320.

我知道这听起来像一个本来会被问过千次的问题,但我还没有找到任何东西......

注意:我知道重复使用单元格会有问题,但我还没有达到这一点.

Ban*_*ngs 7

UITableViewCell如果从xib或storyboard初始化,则默认大小取决于xib(storyboard).

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

[tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]
Run Code Online (Sandbox Code Playgroud)

因此,您的单元格将首先被初始化(大小始终(320.0, 44.0)是iphone或ipad),然后调整大小.

所以,你必须调整width的的myTextField同时Cell的大小改变.

有3种解决方案:

使用AutoLayout:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

使用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;
}
Run Code Online (Sandbox Code Playgroud)

使用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);
}
Run Code Online (Sandbox Code Playgroud)