我有一个自定义单元格(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.width
和self.contentView.bounds.size.width
,但两者都返回320.
我知道这听起来像一个本来会被问过几千次的问题,但我还没找到任何东西......
注意:我知道重复使用单元格会有问题,但我还没有达到这一点。
答案 0 :(得分:7)
默认大小<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="first_preferencescreen">
<CheckBoxPreference
android:key="wifi enabled"
android:title="WiFi" />
<PreferenceScreen
android:key="second_preferencescreen"
android:title="WiFi settings">
<CheckBoxPreference
android:key="prefer wifi"
android:title="Prefer WiFi" />
</PreferenceScreen> </PreferenceScreen>
,取决于xib(storyboard),如果它是从xib或storyboard初始化的。
如果你的单元格是从这样的代码初始化的:
cout<<5*1.0<<endl;
cout<<(float)5<<endl;
因此,您的单元格将首先初始化(大小始终为UITableViewCell
,无论是iphone还是ipad),然后调整大小。
因此,当[tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER forIndexPath:indexPath]
的尺寸发生变化时,您必须调整(320.0, 44.0)
的{{1}}。
有3个解决方案:
使用AutoLayout :
width
使用autoresizingMask作为@jpulikkottil说:
myTextField
使用layoutSubviews
Cell
答案 1 :(得分:1)
使用NSLayoutConstraint(推荐)
的示例- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
UITextField *myTextField = [[UITextField alloc] init];
myTextField.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentView addSubview:myTextField];
[self.contentView addConstraint:[NSLayoutConstraint constraintsWithVisualFormat:@"H:[textField(==95)]|" options:0 metrics:nil views:@{@"textField",textField}]];
//Add vertical constraints then
}
return self;
}
这会将textField修复为contentView的权限,并将其宽度设置为95。 你仍然需要添加垂直约束,但这不是重点。
编辑:修复运行时错误
答案 2 :(得分:0)
检查提及方法中的单元格大小
-(void) viewDidLayoutSubviews
{
NSIndexPath *indexPath=[NSIndexPath indexPathForRow:2 inSection:1];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
NSLog(@"width=%f",cell.contentView.frame.size.width);
}
在viewcontroller中编写此函数。