我有一个UITextField,我想给它不可编辑的字符。例如,我有"Hello..."
,我希望用户在o
和.
之间写入,例如"Hello userTypedStuff..."
我使用了这种方法,但是使用它,用户可以长按开头,例如转到Hello中的位置。因此,用户可以弄乱前缀字符。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let protectedRange = NSMakeRange(0, 5)
let intersection = NSIntersectionRange(protectedRange, range)
if intersection.length > 0 {
return false
}
if range.location == 12 {
return true
}
if range.location + range.length > 12 {
return false
}
return true
}
如何设置'不可编辑的前5个字符和最后3个字符'?
编辑:UITextField的文本对齐中心,正在UILabel上方形成。但是,如果我给textField标签的宽度,textField的宽度不会更大。因此,我给出了宽度视图的宽度。有没有办法可以分别在Hello
和...
的两端创建UILabel,并且在中间有textField(文本对齐的中心),自动拉伸宽度?
编辑2:
如果我的文本视图两侧都有两个静态UILabel,那么这可能是一种解决方法。但是,这次UITextField不会在用户开始输入时将UILabel推送到两侧.TextField center textAligned。如果我在创建它时给它一个恒定的宽度(以CGRectMake
编程),它将不会在用户输入时拉伸它的宽度。因此,我给它了视图的宽度。有没有办法自动拉伸TextField的宽度作为用户类型,推动两侧的UILabels?
"Hello" [textfield] "..."
uilabel uilabel
答案 0 :(得分:0)
class SpecialTextField: UITextField {
// MARK: - UITextField Observing
override internal func willMoveToSuperview(newSuperview: UIView!) {
if newSuperview != nil {
text = "Hello..."
addTarget(self, action: #selector(SpecialTextField.didChangeText), forControlEvents: .EditingChanged)
}
}
override internal func canPerformAction(action: Selector, withSender sender: AnyObject?) -> Bool {
return false
}
private var newVal: String = "Hello..."
func didChangeText() {
var userDidEditDefaultValue = true
if (text?.characters.count > 7) { // Count of "Hello..."
if text?.rangeOfString("Hello") != nil {
if text?.rangeOfString("...") != nil {
userDidEditDefaultValue = false
}
}
}
if userDidEditDefaultValue {
text = newVal
}
newVal = text ?? "Hello..."
}
}
这不允许用户更改“Hello ...”或“Hello userEntry ...”的默认值
您可以使用委托方法在中间插入文本。
希望它有所帮助。