UITextField 占位符对齐滚动问题
Posted
技术标签:
【中文标题】UITextField 占位符对齐滚动问题【英文标题】:UITextField placeholder alignment scrolling trouble 【发布时间】:2015-03-14 20:30:00 【问题描述】:我实际上正在填写注册表,但遇到了一些麻烦。
我在单元格中使用了 UITextField,并且在占位符中写入了一个字符串。在我尝试将 UITextField.textAlignment 居中之前,一切都运行良好。它以某种方式设法不使其居中。我检查了它并做了一些测试,我认为这可能是由于约束的问题(我真的希望我的表单适用于 iphone 4s、5、6 和 6+ 屏幕)。当我在 iphone 6 上时,它看起来几乎居中,但是你会看到字符串越来越不居中,如果你切换到 iphone 5 然后是 iphone 4s,它会转向右侧。到目前为止,我只使用了两个高度约束。
现在“好的”事情是当我滚动我的 tableView 时,如果我的单元格看不见,一旦我重新加载我的单元格,占位符字符串会第二次出现,但在正确的位置(这次是真正的中心)旧的错位占位符字符串。我希望这个占位符在我第一次加载表格时出现滚动时显示,因为它似乎是我想要得到的确切结果。但这仅在我尝试将占位符居中时出现,如果我不这样做,则不会显示第二个占位符字符串。我给你两个图片链接,因为我的英语很糟糕,你们这样可能会更好地理解。
+= 当我滚动 tableView 时,我的代码没有发生任何事情,它运行相同的 CellForRowAtIndexPath 但仍然有不同的结果。
感谢你们带给我的所有建议和帮助
占位符不完全位于中心的普通屏幕:
第二个占位符在正确位置的错误屏幕:
这是我正在运行的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
NSString *identifier = @"id";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
if (indexPath.section == 0)
self.LastName = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
self.LastName.placeholder= @"Last Name";
self.LastName.autocorrectionType = UITextAutocorrectionTypeNo;
self.LastName.textAlignment = NSTextAlignmentCenter;
self.LastName.delegate = self;
[self.LastName setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.LastName setTextColor:[UIColor whiteColor]];
[cell.contentView addSubview:self.LastName];
[cell.contentView.layer setBorderColor:[UIColor whiteColor].CGColor];
else if (indexPath.section == 1)
self.Name = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
self.Name.placeholder= @"Name";
self.Name.autocorrectionType = UITextAutocorrectionTypeNo;
self.Name.textAlignment = NSTextAlignmentCenter;
self.Name.delegate = self;
[self.Name setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.Name setTextColor:[UIColor whiteColor]];
[cell.contentView addSubview:self.Name];
[cell.contentView.layer setBorderColor:[UIColor whiteColor].CGColor];
else if (indexPath.section == 2)
self.Email = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
self.Email.placeholder= @"Email";
self.Email.autocorrectionType = UITextAutocorrectionTypeNo;
self.Email.textAlignment = NSTextAlignmentCenter;
self.Email.delegate = self;
[self.Email setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.Email setTextColor:[UIColor whiteColor]];
[cell.contentView addSubview:self.Email];
[cell.contentView.layer setBorderColor:[UIColor whiteColor].CGColor];
else if (indexPath.section == 3)
self.Password = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
self.Password.placeholder= @"Password";
self.Password.autocorrectionType = UITextAutocorrectionTypeNo;
self.Password.textAlignment = NSTextAlignmentCenter;
self.Password.delegate = self;
[self.Password setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.Password setTextColor:[UIColor whiteColor]];
[cell.contentView addSubview:self.Password];
[cell.contentView.layer setBorderColor:[UIColor whiteColor].CGColor];
else if (indexPath.section == 4)
self.RepetePassword = [[UITextField alloc] initWithFrame:cell.contentView.bounds];
self.RepetePassword.placeholder= @"Repeat password";
self.RepetePassword.autocorrectionType = UITextAutocorrectionTypeNo;
self.RepetePassword.textAlignment = NSTextAlignmentCenter;
self.RepetePassword.delegate = self;
[self.RepetePassword setValue:[UIColor whiteColor] forKeyPath:@"_placeholderLabel.textColor"];
[self.RepetePassword setTextColor:[UIColor whiteColor]];
[cell.contentView addSubview:self.RepetePassword];
[cell.contentView.layer setBorderColor:[UIColor whiteColor].CGColor];
else if (indexPath.section == 5)
cell.textLabel.text = @"Register";
cell.textLabel.textAlignment = NSTextAlignmentCenter;
cell.textLabel.textColor = [UIColor whiteColor];
[cell.contentView.layer setBackgroundColor:[UIColor greenColor].CGColor];
[cell.contentView.layer setBorderColor:[UIColor clearColor].CGColor];
cell.backgroundColor = [UIColor clearColor];
cell.backgroundView = [UIView new];
cell.selectedBackgroundView = [UIView new];
[cell.contentView.layer setBorderWidth:1.0f];
[cell.contentView.layer setCornerRadius:20.0f];
[cell.contentView.layer setMasksToBounds:YES];
return cell;
【问题讨论】:
【参考方案1】:第一件事是您在 cellForRowAtIndexPath 方法中分配您的 uitextfield,这就是为什么它们在您滚动时一次又一次出现的原因。因为 uitableview 的性质是在可见单元格中执行开发人员想要的任何操作,而不是在屏幕外,这就是为什么当您滚动此方法一次又一次地调用。只需尝试在 viewDidLoad 方法或其他地方分配文本字段。 第二件事是让它们随心所欲地可见,您可以在 uitableviewcell 中水平和垂直地使用约束中心。要在 UI 中执行此操作,只需选择您的 uitextfield,按住 control 键并将其拖入其中,然后单击 center horizanticall 和垂直。 我希望这些建议可以解决您的问题。
【讨论】:
谢谢,您的第一个回答确实帮助我理解了我的错误。但我无法理解第二部分,我的 uiTextField 仅在我的代码中,我没有将它放入我的情节提要中,所以我想我必须将约束修复到代码中? 绝对可以在代码中做到这一点,而且在代码中比在 ui 中更好。所以只需检查下面的代码如何做到这一点。我只是在界限之间给出了 50,您可以根据需要修复它。 yourtextfield.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(yourtextfield); NSArray *constarints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[yourtextfield]-50-|"选项:0 指标:nil 意见:viewsDictionary]; [你的文本字段添加约束:约束];如果需要,也可以垂直做同样的事情。 谢谢,经过 2 小时的努力,我想出了如何解决这些约束(遇到了一些麻烦,因为它是一个 self.LastName 并且我在将我的 TextView 放入单元格之前使用了约束,我是约束 TextView 而不是 Cell 本身)。非常感谢您的帮助,感谢您,我今天对 iO 有了更多的了解。以上是关于UITextField 占位符对齐滚动问题的主要内容,如果未能解决你的问题,请参考以下文章
在 UITextField 中右对齐 PlaceHolder 文本