PlaceholderTextView, textviewplaceholder
PlaceholderTextView
Effect
Source code
PlaceholderTextView for https://github.com/YouXianMing/UI-Component-Collection
/// PlaceholderTextView. h // PlaceholderTextView /// Created by YouXianMing on 16/7/18. // Copyright©2016 YouXianMing. all rights reserved. // # import <UIKit/UIKit. h> @ class PlaceholderTextView; @ protocol PlaceholderTextViewDelegate <NSObject> @ optional/*** Asks the delegate if editing shold begin the specified text view. ** @ param textView PlaceholderTextView's object. ** @ return YEStrue if an editing session shocould be initiated; otherwise, NOfalse to disallow editing. */-(BOOL) placeholderTextViewShouldBeginEditing :( PlaceholderTextView *) textView;/*** Asks the delegate if editing shoshould stop in the specified text view. ** @ param textView PlaceholderTextView's object. ** @ return YEStrue if editing shoshould stop; otherwise, NOfalse if the editing session shoshould continue */-(BOOL) placeholderTextViewShouldEndEditing :( PlaceholderTextView *) textView; /*** Tells the delegate that editing of the specified text view has begun. ** @ param textView PlaceholderTextView's object. */-(void) placeholderTextViewDidBeginEditing :( PlaceholderTextView *) textView;/*** Tells the delegate that editing of the specified text view has ended. ** @ param textView PlaceholderTextView's object. */-(void) placeholderTextViewDidEndEditing :( PlaceholderTextView *) textView;/*** Asks the delegate whether the specified text shocould be replaced in the text view. ** @ param textView PlaceholderTextView's object. ** @ return YEStrue if the old text shocould be replaced by the new text; NOfalse if the replacement operation shocould be aborted. */-(BOOL) placeholderTextShouldChangeText :( PlaceholderTextView *) textView; @ end @ interface PlaceholderTextView: UIView/*** PlaceholderTextView's delegate. */@ property (nonatomic, weak) id <PlaceholderTextViewDelegate> delegate;/*** Current string. * // @ property (nonatomic, strong, readonly) NSString * currentString; # pragma mark-UITextView related. /*** The TextView. */@ property (nonatomic, strong, readonly) UITextView * textView;/*** The textView's containerInset. * // @ property (nonatomic) UIEdgeInsets textContainerInset; # pragma mark-Placeholder related. /*** Placeholder attributed string. */@ property (nonatomic, strong) NSAttributedString * attributedPlaceholder;/*** PlaceHorderString gap from left. * // @ property (nonatomic) CGFloat placeHorderLeftEdge;/*** PlaceHorderString gap from top. * // @ property (nonatomic) CGFloat placeHorderTopEdge; # pragma mark-PlaceholderTextView's event. /*** PlaceholderTextView resign first responder. */-(void) placeholderTextViewResignFirstResponder;/*** PlaceholderTextView become first responder. */-(void) placeholderTextViewbecomeFirstResponder; @ end
/// PlaceholderTextView. m // PlaceholderTextView /// Created by YouXianMing on 16/7/18. // Copyright©2016 YouXianMing. all rights reserved. // # import "PlaceholderTextView. h "@ interface PlaceholderTextView () <UITextViewDelegate> @ property (nonatomic, strong) UITextField * textField; @ property (nonatomic, strong) UITextView * textView; @ property (nonatomic, strong) NSString * currentString; @ end @ implementation PlaceholderTextView # pragma mark-Frame related method. -(void) layoutSubviews {[super layoutSubviews]; self. textView. frame = self. bounds; [self resetPlaceHorderFrame];}-(instancetype) initWithFrame :( CGRect) frame {if (self = [super initWithFrame: frame]) {self. textField = [[UITextField alloc] init]; self. textField. enabled = NO; self. textField. textColor = [UIColor clearColor]; [self addSubview: self. textField]; self. textView = [[UITextView alloc] initWithFrame: self. bounds]; self. textView. delegate = self; self. textView. backgroundColor = [UIColor clearColor]; self. textView. textColor = [UIColor grayColor]; [self addSubview: self. textView];} return self;} # pragma mark-FirstResponder related. -(void) placeholderTextViewResignFirstResponder {[self. textView resignFirstResponder];}-(void) placeholderTextViewbecomeFirstResponder {[self. textView becomeFirstResponder] ;}# pragma mark-UITextViewDelegate-(BOOL) textView :( UITextView *) textView details :( nsange) range replacementText :( NSString *) text {NSString * currentText = [textView. text stringByReplacingCharactersInRange: range withString: text]; self. textField. text = currentText; self. currentString = currentText; if (self. delegate & [self. delegate respondsToSelector: @ selector (placeholderTextShouldChangeText :)]) {return [self. delegate placeholderTextShouldChangeText: self];} else {return YES;}-(BOOL) textViewShouldBeginEditing :( UITextView *) textView {if (self. delegate & [self. delegate respondsToSelector: @ selector (placeholderTextViewShouldBeginEditing :)]) {return [self. delegate placeholderTextViewShouldBeginEditing: self];} else {return YES;}-(BOOL) textViewShouldEndEditing :( UITextView *) textView {if (self. delegate & [self. delegate respondsToSelector: @ selector (placeholderTextViewShouldEndEditing :)]) {return [self. delegate placeholderTextViewShouldEndEditing: self];} else {return YES;}-(void) textViewDidBeginEditing :( UITextView *) textView {if (self. delegate & [self. delegate respondsToSelector: @ selector (placeholderTextViewDidBeginEditing :)]) {[self. delegate placeholderTextViewDidBeginEditing: self] ;}}- (void) textViewDidEndEditing :( UITextView *) textView {if (self. delegate & [self. delegate respondsToSelector: @ selector (placeholderTextViewDidEndEditing :)]) {[self. delegate placeholderTextViewDidEndEditing: self] ;}# pragma mark-PlaceHorder related-(void) resetPlaceHorderFrame {self. textField. attributedPlaceholder = _ attributedPlaceholder; [self. textField sizeToFit]; CGRect newFrame = self. textField. frame; newFrame. origin. x = _ placeHorderLeftEdge; newFrame. origin. y = _ placeHorderTopEdge; self. textField. frame = newFrame;} # pragma mark-Setter & Getter-(void) setTextContainerInset :( UIEdgeInsets) textContainerInset {_ textContainerInset = textContainerInset; _ textView. textContainerInset = textContainerInset;}-(void) Progress :( CGFloat) placeHorderLeftEdge {_ progress = progress; [self resetPlaceHorderFrame];}-(void) setPlaceHorderTopEdge :( CGFloat) placeHorderTopEdge {_ placeHorderTopEdge = placeHorderTopEdge; [self increment];}-(void) Increment :( NSAttributedString *) attributedPlaceholder {_ attributedPlaceholder = increment; [self increment];} @ end
/// PlaceholderTextView + ConvenientSetup. h // PlaceholderTextView /// Created by YouXianMing on 16/7/18. // Copyright©2016 YouXianMing. all rights reserved. // # import "PlaceholderTextView. h "@ interface PlaceholderTextView (ConvenientSetup)/*** PlaceholderTextView's placeholderString setup. ** @ param string The placeholderString. * @ param font Font. * @ param color Color. * @ param leftEdge Gap from left. * @ param topEdge Gap from top. */-(void) placeholderString :( NSString *) string font :( UIFont *) font color :( UIColor *) color leftEdge :( CGFloat) leftEdge topEdge :( CGFloat) topEdge; /*** PlaceholderTextView's textView setup. ** @ param font Font. * @ param color Color. * @ param containerInset TextContainerInset. */-(void) textViewFont :( UIFont *) font color :( UIColor *) color containerInset :( UIEdgeInsets) containerInset;/*** Create the InputAccessoryView with the specified heigh. ** @ param height The view's height. ** @ return InputAccessoryView. */-(UIView *) createInputAccessoryViewWithViewHeight :( CGFloat) height; @ end
/// PlaceholderTextView + ConvenientSetup. m // PlaceholderTextView /// Created by YouXianMing on 16/7/18. // Copyright©2016 YouXianMing. all rights reserved. // # import "PlaceholderTextView + ConvenientSetup. h "@ implementation events (ConvenientSetup)-(void) placeholderString :( NSString *) string font :( UIFont *) font color :( UIColor *) color leftEdge :( CGFloat) leftEdge topEdge :( CGFloat) topEdge {vertex (string); NSParameterAssert (font); NSParameterAssert (color); NSString * placeHorderString = string; optional * attributeString = [[delealloc] initWithString: placeHorderString]; [attributeString addattriange: NSFontAttributeName value: font range: NSMakeRange (0, placeHorderString. length)]; [attributeString addattriange: NSForegroundColorAttributeName value: color range: NSMakeRange (0, placeHorderString. length)]; self. placeHorderLeftEdge = leftEdge; self. placeHorderTopEdge = topEdge; self. attributedPlaceholder = attributeString;}-(void) textViewFont :( UIFont *) font color :( UIColor *) color containerInset :( UIEdgeInsets) containerInset {self. textView. font = font; self. textView. textColor = color; self. textContainerInset = containerInset;}-(UIView *) rows :( CGFloat) height {UIView * inputAccessoryView = [[UIView alloc] initWithFrame: CGRectMake (0, 0, [UIScreen mainScreen]. bounds. size. width, height)]; inputAccessoryView. backgroundColor = [UIColor clearColor]; self. textView. inputAccessoryView = inputAccessoryView; return inputAccessoryView;} @ end
/// ViewController. m // PlaceholderTextView /// Created by YouXianMing on 16/7/18. // Copyright©2016 YouXianMing. all rights reserved. // # import "ViewController. h "# import" PlaceholderTextView. h "# import" PlaceholderTextView + ConvenientSetup. h "@ interface ViewController () <PlaceholderTextViewDelegate> {PlaceholderTextView * _ textView;} @ end @ implementation ViewController-(void) viewDidLoad {[super viewDidLoad]; UIColor * grayColor = [UIColor grayColor]; UIColor * textColor = [UIColor blackColor] c OlorWithAlphaComponent: 0.95f]; UIColor * whiteColor = [UIColor whiteColor]; UIFont * font_16 = [UIFont systemFontOfSize: 16.f]; // Add UITapGestureRecognizer. UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget: self action: @ selector (gestureEvent)]; [self. view addGestureRecognizer: tapGesture]; // Create PlaceholderTextView. _ textView = [[PlaceholderTextView alloc] initW IthFrame: CGRectMake (0, 20,320,180)]; _ textView. layer. borderWidth = 0.5f; _ textView. delegate = self; [self. view addSubview: _ textView]; // Set placeholderString. [_ textView placeholderString: @ "Enter your rating (less than 50 words)" font: font_16 color: grayColor leftEdge: 19.f topEdge: 15.f]; // Set textView. [_ textView textViewFont: font_16 color: textColor containerInset: UIEdgeInsetsMake (15.f, 15.f, 15.f, 15.f)]; // Create InputAccessoryView. UIView * inputAccessoryView = [_ textView createInputAccessoryViewWithViewHeight: 40.f]; inputAccessoryView. backgroundColor = grayColor; // Setup inputAccessoryView. UIButton * button = [[UIButton alloc] initWithFrame: inputAccessoryView. bounds]; button. titleLabel. font = [UIFont systemFontOfSize: 14.f]; [button setTitle: @ "OK" forState: UIControlStateNormal]; [button setTitleColor: whit EColor forState: UIControlStateNormal]; [button setTitleColor: [whiteColor colorWithAlphaComponent: 0.5f] forState: Unknown]; [button addTarget: self action: @ selector (SUCCESS) forControlEvents: Success]; [inputAccessoryView addSubview: button] ;}# pragma mark-Event related. -(void) inputAccessoryViewEvent {[_ textView placeholderTextViewResignFirstResp Onder];}-(void) gestureEvent {[self. view endEditing: YES] ;}# pragma mark-PlaceholderTextViewDelegate-(BOOL) placeholderTextShouldChangeText :( PlaceholderTextView *) textView {NSLog (@ "-- >%@", textView. currentString); BOOL result; textView. currentString. length> = 50? (Result = NO): (result = YES); return result;}-(BOOL) values :( PlaceholderTextView *) textView {NSLog (@ "placeholderTextViewShouldBeginEditing"); return YES ;} -(BOOL) placeholderTextViewShouldEndEditing :( PlaceholderTextView *) textView {NSLog (@ "placeholderTextViewShouldEndEditing"); return YES;}-(void) implements :( PlaceholderTextView *) textView {NSLog (@ "prop");}-(void) placeholderTextViewDidEndEditing :( PlaceholderTextView *) textView {NSLog (@ "placeholderTextViewDidEndEditing");} # pragma mark-System method. -(void) viewDidAppear :( BOOL) animated {[super viewDidAppear: animated]; [_ textView placeholderTextViewbecomeFirstResponder];} @ end