2013-08-09 15 views
16

Come posso evitare la modifica del testo in un UITextField insieme nascondere il cursore/cursore/lente d'ingrandimento, ma ancora presente la tastiera, come Sto usando uno inputView con uno UIPickerView/UIDatePickerView?modifica Impedire di testo in UITextField e nascondere il cursore/cursore/lente d'ingrandimento durante l'utilizzo di un inputView

L'impostazione da userInteractionEnabled a NO non funziona perché non riceve più alcun tocco e non presenta la tastiera.

risposta

17

sottoclasse UITextField

//Disables caret 
- (CGRect)caretRectForPosition:(UITextPosition *)position 
{ 
    return CGRectZero; 
} 

//Disables magnifying glass 
-(void)addGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if ([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) 
    { 
     gestureRecognizer.enabled = NO; 
    } 
    [super addGestureRecognizer:gestureRecognizer]; 
} 

Nella tua UITextFieldDelegate

//Prevent text from being copied and pasted or edited with bluetooth keyboard. 
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    return NO; 
} 

Ora basta impostare il testo a livello di codice dal risultato della vostra UIPickerView/UIDatePicker.

+0

non funziona con il simulatore iOS6 – raistlin

+0

Non ci sono riconoscitori di gesti (iOS 8): (lldb) po [textField gestureRecognizers] -> nil –

5

Spero che questo sia utile per voi.

Imposta il cursore UIColor -> Empty. Nell'interfaccia utente, sarà nascosto.

[[self.textField valueForKey:@"textInputTraits"] setValue:[UIColor clearColor] forKey:@"insertionPointColor"]; 
+0

è questo un modo ufficiale per questo? Penso che questa sia una manipolazione dell'API privata di Apple. –

+0

Mi chiamo, questo è il modo ufficiale. Ma questo è uno dei modi per archiviare l'attività .. –

+0

Questo mi sembra sospetto! Usa la risposta di Walapu. –

15

nascondere il cursore è molto più semplice in iOS 7. Ancora bisogno di qualche inganno per disabilitare la lente di ingrandimento

textField.tintColor = [UIColor clearColor]; 
+0

Ancora non si sa perché l'impostazione di tintColor dallo storyboard non abbia effetto, nonostante il codice. – samthui7

0

Per disabilitare qualsiasi interazione con campo di testo tranne che lo rende un primo risponditore si può solo posto un UIButton della stessa dimensione proprio sopra il campo di testo. Codice per l'evento di rubinetto pulsante potrebbe essere qualcosa di simile:

- (IBAction)btnEditPhoneTapped:(id)sender 
{ 
    if (self.tfClientPhoneNo.isFirstResponder == NO) [self.tfClientPhoneNo becomeFirstResponder]; 
} 
2

ho trovato la soluzione migliore era

- (CGRect) caretRectForPosition:(UITextPosition*) position 
{ 
    return CGRectZero; 
} 

- (NSArray *)selectionRectsForRange:(UITextRange *)range 
{ 
    return nil; 
} 

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{ 
    if (action == @selector(copy:) || action == @selector(selectAll:) || action == @selector(paste:)) 
    { 
     returnNO; 
    } 

    return [super canPerformAction:action withSender:sender]; 
} 

http://b2cloud.com.au/tutorial/disabling-the-caret-and-text-entry-in-uitextfields/

+0

Funziona, ma è ancora possibile fare clic e digitare nel campo di testo a meno che non si implementi anche ** textField: shouldChangeCharactersInRange: replacementString: ** come da risposta di Walapu. –

1

Per avere un UITextField senza interazione, ma ancora lavorare con un inputView:

Sottoclasse UITextField con questi metodi:

// Hide the cursor 
- (CGRect)caretRectForPosition:(UITextPosition*)position 
{ 
    return CGRectZero; 
} 

// All touches inside will be ignored 
// and intercepted by the superview 
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return NO; 
} 

L'ultimo metodo da sola impedire qualsiasi modifica e la lente di ingrandimento, in quanto non sarà in grado di toccare il UITextField.

Questo funziona perfettamente se si utilizza un campo di testo in un UITableViewCell per esempio, e quindi è possibile alternare lo stato FirstResponder tramite tableView:didSelectRowAtIndexPath:.