iOS开发项目篇—28自定义UITextView

iOS开发项目篇—28自定义UITextView

一、简单说明

1.要实现的效果

2.分析

(1)UITextField

1.最多只能输入一行文字

2.能设置提醒文字(placehoder)

3.不具备滚动功能

(2)UITextView

1.能输入N行文字(N>0)

2.不能设置提醒文字(没有placehoder属性)

3.具备滚动功能

需求:技能输入多行文字,又具备文字提醒功能。

这里选择自定义一个类,让其继承自UITextView类,为其添加一个设置文字提醒的功能。

二、实现

自定义UI控件,让其继承自UITextView类

YYTextView.h文件代码

 1 //
 2 //  YYTextView.h
 3 //  21-微博自定义UITextView
 4 //
 5
 6 #import <UIKit/UIKit.h>
 7
 8 @interface YYTextView : UITextView
 9 @property(nonatomic,copy)NSString *placehoder;
10 @property(nonatomic,strong)UIColor *placehoderColor;
11 @end

YYTextView.m文件代码

  1 //
  2 //  YYTextView.m
  3 //  21-微博自定义UITextView
  4 //
  5
  6 #import "YYTextView.h"
  7
  8 @interface YYTextView()
  9 @property(nonatomic,weak)UILabel *placehoderLabel;
 10 @end
 11 @implementation YYTextView
 12
 13 - (id)initWithFrame:(CGRect)frame
 14 {
 15     self = [super initWithFrame:frame];
 16     if (self) {
 17         self.backgroundColor=[UIColor clearColor];
 18
 19         // 1.添加一个显示提醒文字的label(显示占位文字的label)
 20         UILabel *placehoderLabel=[[UILabel alloc]init];
 21         //2.设置相关的属性
 22         //设置支持多行格式
 23         placehoderLabel.numberOfLines=0;
 24         //设置清除背景颜色
 25         placehoderLabel.backgroundColor=[UIColor clearColor];
 26         //3.把控件添加到view上
 27         [self  addSubview:placehoderLabel];
 28
 29         //4.使用全局变量来记录
 30         self.placehoderLabel=placehoderLabel;
 31
 32         //设置默认的占位文字的颜色为亮灰色
 33         self.placehoderColor=[UIColor lightGrayColor];
 34         //设置默认的字体为14号字体
 35         self.font=[UIFont systemFontOfSize:14];
 36
 37         //注册一个通知中心,监听文字的改变
 38         [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
 39
 40     }
 41     return self;
 42 }
 43
 44 -(void)dealloc
 45 {
 46     [[NSNotificationCenter defaultCenter]removeObserver:self];
 47 }
 48
 49
 50 #pragma mark-监听文字的改变
 51 -(void)textDidChange
 52 {
 53     if (self.text.length==0) {//显示占位文字
 54         self.placehoderLabel.hidden=NO;
 55     }else{  //隐藏占位文字
 56         self.placehoderLabel.hidden=YES;
 57     }
 58
 59     self.placehoderLabel.hidden=(self.text.length!=0);
 60 }
 61
 62 #pragma mark 设置占位文字
 63 -(void)setPlacehoder:(NSString *)placehoder
 64 {
 65 #warning 如果是copy策略,setter最好这么写
 66     _placehoder=[placehoder copy];
 67     //设置文字
 68     self.placehoderLabel.text=placehoder;
 69     //重新计算文字的frame
 70     [self setNeedsLayout];
 71 }
 72
 73 #pragma mark 设置占位文字的颜色
 74 -(void)setPlacehoderColor:(UIColor *)placehoderColor
 75 {
 76     _placehoderColor=placehoderColor;
 77     self.placehoderLabel.textColor=placehoderColor;
 78 }
 79
 80 - (void)layoutSubviews
 81 {
 82     [super layoutSubviews];
 83
 84     self.placehoderLabel.y = 8;
 85     self.placehoderLabel.x = 5;
 86     self.placehoderLabel.width = self.width - 2 * self.placehoderLabel.x;
 87
 88     // 根据文字计算label的高度
 89     CGSize maxSize = CGSizeMake(self.placehoderLabel.width, MAXFLOAT);
 90     CGSize placehoderSize = [self.placehoder sizeWithFont:self.placehoderLabel.font constrainedToSize:maxSize];
 91     self.placehoderLabel.height = placehoderSize.height;
 92 }
 93
 94 -(void)setFont:(UIFont *)font
 95 {
 96     //该属性是继承来的,因此需要调用父类的方法
 97     [super setFont:font];
 98     self.placehoderLabel.font=font;
 99     //重新计算子控件的frame
100     [self setNeedsLayout];
101 }
102
103 -(void)setText:(NSString *)text
104 {
105     [super setText:text];
106     [self textDidChange];
107 }
108 @end

在发送微博控制器中:

YYComposeViewController.m文件代码

 1 //
 2 //  YYComposeViewController.m
 3 //
 4
 5 #import "YYComposeViewController.h"
 6 #import "YYTextView.h"
 7
 8 @interface YYComposeViewController ()
 9 @property(nonatomic,weak)YYTextView *textView;
10 @end
11
12 @implementation YYComposeViewController
13
14
15 - (void)viewDidLoad
16 {
17     [super viewDidLoad];
18
19     //设置导航栏
20     [self setupNavBar];
21
22     //添加子控件
23     [self setupTextView];
24
25 }
26 //添加子控件
27 -(void)setupTextView
28 {
29     //1.创建输入控件
30     YYTextView *textView=[[YYTextView alloc]init];
31     //设置frame
32     textView.frame=self.view.bounds;
33     [self.view addSubview:textView];
34     self.textView=textView;
35
36     //2.设置占位文字提醒
37     textView.placehoder=@"分享新鲜事···分享新鲜事···分享新鲜事···分享新鲜事···分享新鲜事···分享新鲜事···";
38     //3.设置字体(说明:该控件继承自UITextfeild,font是其父类继承下来的属性)
39     textView.font=[UIFont systemFontOfSize:15];
40     //设置占位文字的颜色为棕色
41     textView.placehoderColor=[UIColor brownColor];
42 }
43
44 //设置导航栏
45 -(void)setupNavBar
46 {
47     self.title=@"发消息";
48     self.view.backgroundColor=[UIColor whiteColor];
49     self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(cancel)];
50     self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"发送" style:UIBarButtonItemStyleBordered target:self action:@selector(send)];
51     self.navigationItem.rightBarButtonItem.enabled=NO;
52 }
53
54 -(void)send
55 {
56     YYLog(@"发送----");
57 }
58
59 -(void)cancel
60 {
61 //    [self dismissViewControllerAnimated:YES completion:nil];
62     self.textView.text=@"测试";
63 }
64 @end

实现效果:

   

注意:计算frame的代码段

 1 - (void)layoutSubviews
 2 {
 3     [super layoutSubviews];
 4
 5     self.placehoderLabel.y = 8;
 6     self.placehoderLabel.x = 5;
 7     self.placehoderLabel.width = self.width - 2 * self.placehoderLabel.x;
 8
 9     // 根据文字计算label的高度
10     CGSize maxSize = CGSizeMake(self.placehoderLabel.width, MAXFLOAT);
11     CGSize placehoderSize = [self.placehoder sizeWithFont:self.placehoderLabel.font constrainedToSize:maxSize];
12     self.placehoderLabel.height = placehoderSize.height;
13 }

iOS开发项目篇—28自定义UITextView,布布扣,bubuko.com

时间: 2024-12-23 04:20:50

iOS开发项目篇—28自定义UITextView的相关文章

iOS开发项目篇—29自定义工具条

iOS开发项目篇—29自定义工具条 一.简单说明 1.实现效果: 2.实现思路: (1)尝试: 1 //添加子控件 2 -(void)setupTextView 3 { 4 //1.创建输入控件 5 YYTextView *textView=[[YYTextView alloc]init]; 6 //设置frame 7 textView.frame=self.view.bounds; 8 [self.view addSubview:textView]; 9 self.textView=textV

iOS开发项目篇—27自定义UITabBar

iOS开发项目篇—27自定义UITabBar 一.自定义 思路: (1)新建一个继承自UITabBar的类,自定义一个UITabBar (2)用自定义的UITabBar换掉系统的UItabBar(使用了KVC) (3)监听控制器的切换,只要控制器一切换,就调用代理方法强制重新布局子控件(内部会调用layoutSubviews). YYTabBar.m文件代码: 1 // 2 // YYTabBar.m 3 // 4 5 #import "YYTabBar.h" 6 7 @interfa

iOS开发项目篇—54&quot;设置&quot;界面的搭建

iOS开发项目篇—54"设置"界面的搭建 一.实现 新建一个设置控制器,当点击“我”控制器导航栏“设置”按钮时,即跳转到该界面 1.在“我”控制器中对导航栏“设置按钮”的处理 1 // 2 // YYProfileViewController.m 3 // 4 5 #import "YYProfileViewController.h" 6 #import "YYCommonGroup.h" 7 #import "YYCommonItem

iOS开发项目篇—50设置cell的背景

iOS开发项目篇—50设置cell的背景 一.简单说明 当前样式: 1.去掉分隔线 2.设置背景图片(新浪提供了四种图片,底部的图片有阴影) cell的四种背景图 问题:cell怎么知道自己当前是处在第几组的第几行? 在自定义cell中提供一个方法,共外界传递当前的组和行 YYCommonCell.h文件 1 // 2 // YYCommonCell.h 3 // 4 5 #import <Foundation/Foundation.h> 6 @class YYCommonItem; 7 @i

iOS开发项目篇—13标题栏设置

iOS开发项目篇—13标题栏设置 一.添加标题栏 代码: 1 #import "YYHomeTableViewController.h" 2 #import "YYOneViewController.h" 3 4 @interface YYHomeTableViewController () 5 6 @end 7 8 @implementation YYHomeTableViewController 9 10 - (id)initWithStyle:(UITable

iOS开发项目篇—15菜单栏扩展

iOS开发项目篇—16菜单栏扩展 一.简单说明 在15中菜单栏的内在实现效果:         15中是通过Button来监听外部的点击,并做出响应.如果只是单纯的监听点击事件,去掉button,直接用View,给View添加一个手势识别器以监听. 二.在按钮的背后添加一个蒙版 自定义类中增加一个BOOL型的属性 1 // 2 // YYPopMenu.h 3 4 #import <UIKit/UIKit.h> 5 @class YYPopMenu; 6 7 @protocol YYPopMe

iOS开发项目篇—14点击标题按钮弹出菜单

iOS开发项目篇—14点击标题按钮弹出菜单 一.简单说明 (1)简单实现 点击标题按钮弹框,在箭头向上的时候,显示标题菜单 把ImageView添加到谁的身上?三角形的箭头在导航栏上,因此不能添加到tableview上. 分析图示: 有两个两种方法可以考虑: (1)添加到导航控制器上,因为导航栏是在导航控制器上的. (2)不用考虑控制器,直接添加到窗口上. 拿到窗口 (1)self.view.window这个属性谨慎使用,当开始加载的时候,为空 (2)获取主窗口  [UIApplication

iOS开发项目篇—04添加导航栏的按钮

iOS开发项目篇—04添加导航栏的按钮 一.设置导航栏的按钮 要求实现的效果:             说明:默认状态下和高亮状态下的图片是不一样的. 按钮的图片需要设置默认状态和高亮状态时的显示,系统了提供的下面方法 viewController.navigationItem.leftBarButtonItem=[UIBarButtonItem alloc]initWithImage:<#(UIImage *)#> style:<#(UIBarButtonItemStyle)#>

iOS开发项目篇—02添加子控制器以及项目分层

iOS开发项目篇—02添加子控制器以及项目分层 一.添加子控制器 1.设置根控制器(自定义) 说明:分析新浪微博应用,观察其整体建构层次.而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除. 自己定义一个TabBarViewController类.让这个类作为window窗口的根控制器. YYAppDelegate.m文件代码: 1 #import "YYAppDelegate.h" 2 #import "YYTabBarViewController.h&qu