PlaceholderTextView
PlaceholderTextView

效果

源码
https://github.com/YouXianMing/UI-Component-Collection 的 PlaceholderTextView
//
// 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 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 <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 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(, placeHorderString.length)];
[attributeString addAttribute:NSForegroundColorAttributeName value:color range:NSMakeRange(, 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(, , [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] colorWithAlphaComponent:0.95f];
UIColor *whiteColor = [UIColor whiteColor];
UIFont *font_16 = [UIFont systemFontOfSize:.f]; // Add UITapGestureRecognizer.
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gestureEvent)];
[self.view addGestureRecognizer:tapGesture]; // Create PlaceholderTextView.
_textView = [[PlaceholderTextView alloc] initWithFrame:CGRectMake(, , , )];
_textView.layer.borderWidth = 0.5f;
_textView.delegate = self;
[self.view addSubview:_textView]; // Set placeholderString.
[_textView placeholderString:@"请输入您的评价(少于50字)" font:font_16 color:grayColor leftEdge:.f topEdge:.f]; // Set textView.
[_textView textViewFont:font_16 color:textColor containerInset:UIEdgeInsetsMake(.f, .f, .f, .f)]; // Create inputAccessoryView.
UIView *inputAccessoryView = [_textView createInputAccessoryViewWithViewHeight:.f];
inputAccessoryView.backgroundColor = grayColor; // Setup inputAccessoryView.
UIButton *button = [[UIButton alloc] initWithFrame:inputAccessoryView.bounds];
button.titleLabel.font = [UIFont systemFontOfSize:.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 >= ? (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
PlaceholderTextView的更多相关文章
- 简易封装一个带有占位文字的TextView
在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:
- 设计带有placeHolder的TextView
设计带有placeHolder的TextView 效果: 源码: PlaceholderTextView.h 与 PlaceholderTextView.m // // PlaceholderText ...
- UINavigationbar跳转黑色
bug效果:导航栏过渡出现黑色
随机推荐
- 使用 JavaScript 编写优化算法 (1)
之前一直用Python来写优化算法,为了增强 JS 的熟练程度,开始将原有的代码改写成 JS.采用的工具包括 node.js + Grunt + nodeunit + github + npm + t ...
- Linux系统运维笔记(二),Linux文件编辑命令
Linux系统运维笔记 Linux文件编辑命令 首先我们使用命令 vi filename 打开一个文件,这个时候进入到的是命令模式 接下来我们按i,然后键盘随便输入写内容. 然后按ESC重新进入到命令 ...
- 如何简单区分Web前后端与MVC
MVC是开发所有软件所必须涉及的基本几个划分 M主要负责数据与模型,V主要负责显示C主要负责交互与业务所以不管是前端还是后端,都是有MVC的.MVC是一个对于软件简单的抽象,不管是M还是V,还是C都是 ...
- 修改MySQL中的数据
一:insert语句 1.介绍 在执行插入语句前,需要具有执行INSERT语句的INSERT权限. 2.准备环境 3.简单insert语句 4.插入多行 在这种形式中,每行的值列表用逗号分隔. 如果为 ...
- win10无线网连接 提示无法连接到此网络
一.Win10无法连接此网络是怎么回事 对于大多数遇到无法连接此网络问题的,主要是Win10笔记本电脑用户,使用的是无线网络.而出现Win10连接其他无线网络正常,但是就是某个无线网络无法正常连接的时 ...
- 高能天气——团队Scrum冲刺阶段-Day 5
高能天气--团队Scrum冲刺阶段-Day 5 今日完成任务 于欣月:基本实现计步器功能:现阶段实现了每天进行步数统计并显示,计划实现历史步数统计和设置锻炼计划功能,并实现可视化图形界面 余坤澎:实现 ...
- RegExp.$1
在学习vue2的compile的模板解析的时候,会出现这个正则表达式,不是很清楚,所有就弄明白下并记录下来. RegExp 是javascript中的一个内置对象.为正则表达式.RegExp.$1是R ...
- windows10 下安装tensorflow 并且在jupyter notebook 上使用tensorflow
一.安装jupyter notebook并配置环境 首先建议大家安装anaconda,最新版本请到官网下载(点击下载连接),没错,直接点击下载python3.6版本的(当然选择做自己电脑相应的位数,我 ...
- ArduinoYun教程之Arduino编程环境搭建
ArduinoYun教程之Arduino编程环境搭建 Arduino编程环境搭建 通常,我们所说的Arduino一般是指我们可以实实在在看到的一块开发板,他可以是Arduino UNO.Arduino ...
- BZOJ4541 [Hnoi2016]矿区
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...