博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PlaceholderTextView
阅读量:5173 次
发布时间:2019-06-13

本文共 12855 字,大约阅读时间需要 42 分钟。

PlaceholderTextView

 

 效果

 

源码

 的 

////  PlaceholderTextView.h//  PlaceholderTextView////  Created by YouXianMing on 16/7/18.//  Copyright © 2016年 YouXianMing. All rights reserved.//#import 
@class PlaceholderTextView;@protocol PlaceholderTextViewDelegate
@optional/** * Asks the delegate if editing should begin in the specified text view. * * @param textView PlaceholderTextView's object. * * @return YEStrue if an editing session should be initiated; otherwise, NOfalse to disallow editing. */- (BOOL)placeholderTextViewShouldBeginEditing:(PlaceholderTextView *)textView;/** * Asks the delegate if editing should stop in the specified text view. * * @param textView PlaceholderTextView's object. * * @return YEStrue if editing should stop; otherwise, NOfalse if the editing session should 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 should be replaced in the text view. * * @param textView PlaceholderTextView's object. * * @return YEStrue if the old text should be replaced by the new text; NOfalse if the replacement operation should be aborted. */- (BOOL)placeholderTextShouldChangeText:(PlaceholderTextView *)textView;@end@interface PlaceholderTextView : UIView/** * PlaceholderTextView's delegate. */@property (nonatomic, weak) id
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 () 
@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 shouldChangeTextInRange:(NSRange)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)setPlaceHorderLeftEdge:(CGFloat)placeHorderLeftEdge { _placeHorderLeftEdge = placeHorderLeftEdge; [self resetPlaceHorderFrame];}- (void)setPlaceHorderTopEdge:(CGFloat)placeHorderTopEdge { _placeHorderTopEdge = placeHorderTopEdge; [self resetPlaceHorderFrame];}- (void)setAttributedPlaceholder:(NSAttributedString *)attributedPlaceholder { _attributedPlaceholder = attributedPlaceholder; [self resetPlaceHorderFrame];}@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 PlaceholderTextView (ConvenientSetup)- (void)placeholderString:(NSString *)string font:(UIFont *)font color:(UIColor *)color leftEdge:(CGFloat)leftEdge topEdge:(CGFloat)topEdge {        NSParameterAssert(string);    NSParameterAssert(font);    NSParameterAssert(color);        NSString                  *placeHorderString = string;    NSMutableAttributedString *attributeString   = [[NSMutableAttributedString alloc] initWithString:placeHorderString];    [attributeString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, placeHorderString.length)];    [attributeString addAttribute: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 *)createInputAccessoryViewWithViewHeight:(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 () 
{ PlaceholderTextView *_textView;}@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; UIColor *grayColor = [UIColor grayColor]; UIColor *textColor = [[UIColor blackColor] colorWithAlphaComponent: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] initWithFrame:CGRectMake(0, 20, 320, 180)]; _textView.layer.borderWidth = 0.5f; _textView.delegate = self; [self.view addSubview:_textView]; // Set placeholderString. [_textView placeholderString:@"请输入您的评价(少于50字)" 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:@"确定" forState:UIControlStateNormal]; [button setTitleColor:whiteColor forState:UIControlStateNormal]; [button setTitleColor:[whiteColor colorWithAlphaComponent:0.5f] forState:UIControlStateHighlighted]; [button addTarget:self action:@selector(inputAccessoryViewEvent) forControlEvents:UIControlEventTouchUpInside]; [inputAccessoryView addSubview:button];}#pragma mark - Event related.- (void)inputAccessoryViewEvent { [_textView placeholderTextViewResignFirstResponder];}- (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)placeholderTextViewShouldBeginEditing:(PlaceholderTextView *)textView { NSLog(@"placeholderTextViewShouldBeginEditing"); return YES;}- (BOOL)placeholderTextViewShouldEndEditing:(PlaceholderTextView *)textView { NSLog(@"placeholderTextViewShouldEndEditing"); return YES;}- (void)placeholderTextViewDidBeginEditing:(PlaceholderTextView *)textView { NSLog(@"placeholderTextViewDidBeginEditing");}- (void)placeholderTextViewDidEndEditing:(PlaceholderTextView *)textView { NSLog(@"placeholderTextViewDidEndEditing");}#pragma mark - System method.- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [_textView placeholderTextViewbecomeFirstResponder];}@end

 

转载于:https://www.cnblogs.com/YouXianMing/p/5682275.html

你可能感兴趣的文章
LeetCode: Generate Parentheses
查看>>
重建索引
查看>>
海量大数据分布式数据库解决方案思路
查看>>
office web apps
查看>>
45 SQLALchemy
查看>>
一款仿PBA官网首页jQuery焦点图的切换特效
查看>>
UVA 10256 The Great Divide
查看>>
SP编写过程的注意点
查看>>
线程池之ThreadPoolExecutor详解
查看>>
在VUE中使用QRCode.js
查看>>
python高级数据可视化视频Dash1
查看>>
SD_WebImage之相同url图片不更新问题
查看>>
python基础知识
查看>>
java答疑
查看>>
关于nmap扫描端口
查看>>
写题记录+一句话题解:2019
查看>>
iOS7上 使用autolayout让Cell自动调整高度
查看>>
Android SDK开发包国内下载地址
查看>>
常用的几个单页应用程序网站分享
查看>>
ZOJ1003_Crashing Balloon
查看>>