UITextField 占位符对齐滚动问题

UITextField placeholder alignment scrolling trouble

实际上我正在处理注册表,但遇到了一些麻烦。

我在单元格中使用了 UITextField,并在占位符中写入了一个字符串。一切正常,直到我尝试将 UITextField.textAlignment 居中。它以某种方式设法不将其居中。我检查了它并做了一些测试,我认为这可能是约束的问题(我真的希望我的表单适用于 iphone 4s、5、6 和 6+ 屏幕)。当我在 iphone 6 时,它看起来几乎居中,但随后你会看到字符串越来越不居中,如果你切换到 iphone 5 然后 iphone 4s 则向右侧移动。所以到目前为止,我只使用了两个高度约束。

现在 "good" 事情是当我滚动我的 table 视图时,如果我的单元格看不见,一旦我重新加载我的单元格,占位符字符串会第二次出现,但在右边place (这次真正的中心)与旧的错误放置的占位符字符串。当我第一次加载 table 时,我希望这个占位符在我滚动时显示,因为它似乎是我想要得到的确切结果。但这仅在我尝试将占位符居中时出现,如果我不这样做,则不会显示第二个占位符字符串。我会给你2个图片链接,因为我的英语很糟糕,这样你们可能会更好地理解。

+= 当我滚动 table 视图时,我的代码没有发生任何变化,它是 运行 相同的 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;
}

第一件事是你在 cellForRowAtIndexPath 方法中分配你的 uitextfield 这就是为什么当你在 scrolling.Because uitableview 的本质是在可见单元格而不是屏幕外做任何开发人员想要的事情这就是为什么当你滚动这个方法时一次又一次地调用。只需尝试在 viewDidLoad 方法或其他地方分配文本字段。 第二件事是让它们随心所欲地可见,您可以在 uitableviewcell 中水平和垂直使用约束中心。要在 UI 中做到这一点,只需 select 您的 uitextfield 按住控制键并将其拖动到其中,然后单击中心水平和垂直。 我希望这些建议可以解决您的问题。