2016-05-08 3 views
0

У меня есть UITextField, и я хочу дать ему неотредактированные символы. Например, у меня есть "Hello...", и я хочу, чтобы пользователь, чтобы написать между o и ., таких как "Hello userTypedStuff..."UITextField - неотредактированные префиксные символы как в начале, так и в конце

Я использовал этот подход, однако с этим, пользователь может longpress начало и, например, перейти в положение внутри Здравствуйте. Таким образом, пользователь может испортить префиксные символы.

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 не будет увеличиваться по ширине. Таким образом, я дал ширину ширины. Есть ли способ создать UILabel на обоих концах, имеющих Hello и ... отдельно, и иметь textField (с центром с выравниванием по центру) в середине, который автоматически растягивает ширину?


Edit 2:

Если у меня TextView с двумя статическими UILabels с обеих сторон, что может быть обходной путь. Однако на этот раз UITextField не будет нажимать UILabels на стороны, когда пользователь начнет вводить текст. TextField center textAligned. Если я дам ему постоянную ширину при ее создании (программно с CGRectMake), он не будет растягивать свою ширину по мере ввода типов пользователей. Таким образом, я дал ему ширину представления. Есть ли способ автотрассировки ширины TextField как пользовательских типов, который подталкивает UILabels по бокам?

"Hello" [textfield] "..." 
uilabel    uilabel 
+0

Я думаю, что вы идете в правильном направлении только, что вы должны использовать несколько условий в shouldChangeCharactersInRange и, возможно, использовать функцию textfieldshouldbegingediting –

+1

Может просто использовать метку для статического текста и для остальных использовать текстовое поле –

+0

@AhmadIshfaq UITextField является программно и textAlign центрируется. Как добавить статический текст слева и справа и развернуть ширину UITextField по мере ввода типов пользователей. Я помещаю ее поверх метки, и я не мог расширять ширину после предоставления ей ширины метки. Вместо этого я дал UITextField ширину представления. Таким образом, я не уверен, как сделать ярлык с моими префиксами слева и написать и переместить их как пользовательские типы. Не могли бы вы дать более подробную информацию? – senty

ответ

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..." 
} 
} 

Это не позволит пользователю изменить значение по умолчанию «Привет ...» ИЛИ «Привет UserEntry ...»

Вы можете использовать метод делегата для вставки текста в середине.

Надеюсь, это помогло.

+0

Большое спасибо. Можете ли вы создать проект-образец, показывающий его? Я был бы признателен. Я немного смутился о том, как пользователь будет вынужден писать между «Hello» и «...», не имея возможности редактировать эти префиксные части. Как мне создать экземпляр textField на мой взгляд? Просто используя view.addSubview? – senty