次のように、一定のテキストを含むテキストフィールドを編集不可にしたいのですが。
ENTER YOUR NAME:
そして、テキストフィールドをクリックすると、直後にカーソルが表示されます:
また、ユーザーは「ENTER YOURNAME:」を削除または編集できないようにする必要があります。
どうすればこれを実装できますか?
次のように、一定のテキストを含むテキストフィールドを編集不可にしたいのですが。
ENTER YOUR NAME:
そして、テキストフィールドをクリックすると、直後にカーソルが表示されます:
また、ユーザーは「ENTER YOURNAME:」を削除または編集できないようにする必要があります。
どうすればこれを実装できますか?
テキストフィールドのデリゲートをUITextFieldDelegate
実装のインスタンスに設定し、メソッドを使用して、ユーザーが文字列textField:shouldChangeCharactersInRange:replacementString:
を変更しようとしているかどうかを確認します。ENTER YOUR NAME:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// "ENTER YOUR NAME:" occupies the first 16 characters; if the user us trying
// to change something that is within that 16-character range, say "NO"
if (range.location < 16) return NO;
... check additional conditions here
return YES;
}
カーソルを直接配置する方法はないと思いますが、この回答で説明されているように、最初のテキストの末尾のコロンの後に空の選択を行うことができます。
十分な評判がないか、コメントを残すだけですが、Omarが提案しているのは、UILabelを使用して、この場合は「ENTER YOUR NAME:」と表示し、UITextFieldをそのラベルから離れた場所に配置することです。カーソルの位置を制御したい。
見栄えを良くするために、ある種の背景テキストフィールドスタイルの画像(私が行うことです)を配置するか、UILabelのデフォルトの背景を望ましい長さに伸ばしてから、UITextFieldのサブビューがラベルのサブビューの上にあることを確認します。
私はそれを少しトリッキーですが簡単な方法で成し遂げることができました。
UIButton *rem = [UIButton buttonWithType:UIButtonTypeCustom];
rem.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
rem.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);
rem.frame = CGRectMake(0.0f, 210.0f, 300.0f, 40.0f);
[rem setTitle:@"*X1*" forState:UIControlStateNormal];
CALayer * layer1 = [rem layer];
[layer1 setMasksToBounds:YES];
[layer1 setCornerRadius:8.0];
[layer1 setBorderWidth:0.0];
[layer1 setBorderColor:[[UIColor grayColor] CGColor]];
rem.backgroundColor = [UIColor colorWithPatternImage:image];
rem.titleLabel.font = [UIFont systemFontOfSize:17.0f];
rem.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField = [[UITextField alloc] initWithFrame:CGRectMake(45.0f, 210.0f, 255.0f, 40.0f)];
textField.backgroundColor = [UIColor clearColor];
[_textFields addObject:textField];
[textField setBorderStyle:(UITextBorderStyleNone)];
textField.textColor = [UIColor whiteColor];
[TableControll.view addSubview:rem];
[TableControll.view addSubview:textField];
基本的に私は、サイズが望ましいサイズである編集不可能な名前のタイトルでボタンを作成するだけtextField
です。次に、スタイルのないテキストフィールドを作成しwidth - size of text
、その上に追加します。編集できないテキストは選択できません。しかし、テキストフィールドを選択するためのボタンのアクションを実装できると思います。
1つの解決策は、静的コンテンツ(静的テキスト)がまだ存在するかどうかを確認し、存在しない場合は、shouldChangeCharactersInRangeでNOを返すことです。ここにサンプルがあります
- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
NSRange prefixRange = [textField.text rangeOfString:@"ENTER YOUR NAME:"];
if(suffixRange.location == NSNotFound) {
return NO;
}
// Only characters in the NSCharacterSet you choose will insertable.
NSCharacterSet *invalidCharSet = [[NSCharacterSet characterSetWithCharactersInString:ALPHA] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:invalidCharSet] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
ALPHAは#defineALPHA@ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"