文档章节

IOS博客项目搭建-14-发微博自定义TextView输入框

Corwien
 Corwien
发布于 2016/05/09 07:30
字数 792
阅读 85
收藏 2


发微博视图,提示文字背景:

 // IWTextView.m   文件  

//
//  IWTextView.m
//  ItcastWeibo
//
//  Created by apple on 14-5-19.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "IWTextView.h"

@interface IWTextView()

@property (nonatomic,weak) UILabel *placeholderLabel;

@end

@implementation IWTextView


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        UILabel *placeholderLabel = [[UILabel alloc] init];
        placeholderLabel.textColor = [UIColor lightGrayColor];
        placeholderLabel.hidden = YES;
        
        // 文本输入框,文字提示的label背景
        placeholderLabel.backgroundColor = [UIColor orangeColor];
        [self addSubview:placeholderLabel];
        self.placeholderLabel = placeholderLabel;
    }
    return self;
}

-(void)setPlaceholder:(NSString *)placeholder
{
    self.placeholderLabel.text = placeholder;
    
    if(placeholder.length)    // 是否需要显示
    {
        self.placeholderLabel.hidden = NO;
        self.placeholderLabel.frame = self.bounds;
        
        /*
        // 计算frame
        CGFloat maxH = self.frame.size.height;
        CGFloat maxW = self.frame.size.width;
        [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)];
        
        self.placeholderLabel.frame = CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>);
         */
        
    }else{
        self.placeholderLabel.hidden = YES;
    }
    
    self.placeholderLabel.hidden = (placeholder.length == 0);
}

@end


   


文字提示“分享新鲜事”在label的中间,怎么让在第一行左边呢?

IWTextView.m文件:

-(void)setPlaceholder:(NSString *)placeholder
{
    self.placeholderLabel.text = placeholder;
    
    if(placeholder.length)    // 是否需要显示
    {
        self.placeholderLabel.hidden = NO;
        self.placeholderLabel.frame = self.bounds;
        
      
        // 计算frame,设置文字提示“分享新鲜事...”的显示位置
        CGFloat maxH = self.frame.size.height;
        CGFloat maxW = self.frame.size.width;
        CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)];
        
        self.placeholderLabel.frame = CGRectMake(0, 0, placeholderSize.width, placeholderSize.height);
       
        
    }else{
        self.placeholderLabel.hidden = YES;
    }
    
    self.placeholderLabel.hidden = (placeholder.length == 0);
}


  设置文字换行:

 placeholderLabel.numberOfLines = 0;   // 文字换行



从上图可以看出,label跑到光标上边去了,怎么调整呢?

设置placeholderLabel 的添加到父控制器的方式:

IWTextView.m文件:

     
// [self addSubview:placeholderLabel];
   [self insertSubview:placeholderLabel atIndex:0];


然后在设置Placeholder的方法中,设置光标的位置:

     
-(void)setPlaceholder:(NSString *)placeholder
{
    self.placeholderLabel.text = placeholder;
    
    if(placeholder.length)    // 是否需要显示
    {
        self.placeholderLabel.hidden = NO;
        self.placeholderLabel.frame = self.bounds;
        
      
        // 计算frame,设置文字提示“分享新鲜事...”的显示位置
        CGFloat placeholderX = 5;   // ******光标初始位置******
        CGFloat placeholderY = 8;   // ******光标初始位置******
        
        CGFloat maxH = self.frame.size.height;
        CGFloat maxW = self.frame.size.width;
        CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)];
        
        self.placeholderLabel.frame = CGRectMake(placeholderX, placeholderY, placeholderSize.width, placeholderSize.height);
       
        
    }else{
        self.placeholderLabel.hidden = YES;
    }
    
    self.placeholderLabel.hidden = (placeholder.length == 0);
}


我们可以看到,光标已经出现在第一行和提示文字同一行的位置,


下面来实现当输入文字时,提示文字消失,而当删除文字时,又出现提示

实现思路:需要监听textView文字输入,NSNotificationCenter消息通知,当有文字输入时隐藏placeholderLabel

具体实现代码:

   
 // 2.******监听文字改变,是否隐藏placeholder******
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];


 IWTextView.h头文件

//  IWTextView.h
#import <UIKit/UIKit.h>

@interface IWTextView : UITextView
@property (nonatomic, copy)NSString *placeholder;
@property (nonatomic, strong)UIColor *placeholderColor;


@end

IWTextView.m文件

   
//
//  IWTextView.m
//  ItcastWeibo
//
//  Created by apple on 14-5-19.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "IWTextView.h"

@interface IWTextView()

@property (nonatomic,weak) UILabel *placeholderLabel;

@end

@implementation IWTextView


- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        // 1.添加文字提示
        UILabel *placeholderLabel = [[UILabel alloc] init];
        placeholderLabel.textColor = [UIColor lightGrayColor];
        placeholderLabel.hidden = YES;
        
        // 文本输入框,文字提示的label背景
        // placeholderLabel.backgroundColor = [UIColor orangeColor];
        placeholderLabel.numberOfLines = 0;   // 文字换行
        placeholderLabel.adjustsFontSizeToFitWidth = YES;
        
        [self insertSubview:placeholderLabel atIndex:0];
        
        // [self addSubview:placeholderLabel];
        self.placeholderLabel = placeholderLabel;
        
        // 2.******监听文字改变,是否隐藏placeholder******
         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange) name:UITextViewTextDidChangeNotification object:self];
    }
    return self;
}

-(void)setPlaceholder:(NSString *)placeholder
{
    _placeholder = [placeholder copy];   // 保存数据到模型
    
    self.placeholderLabel.text = placeholder;
    
    if(placeholder.length)    // 是否需要显示
    {
        self.placeholderLabel.hidden = NO;
        self.placeholderLabel.frame = self.bounds;
        
      
        // 计算frame,设置文字提示“分享新鲜事...”的显示位置
        CGFloat placeholderX = 5;   // 光标初始位置
        CGFloat placeholderY = 8;
        
        CGFloat maxH = self.frame.size.height;
        CGFloat maxW = self.frame.size.width;
        CGSize placeholderSize = [placeholder sizeWithFont:self.placeholderLabel.font constrainedToSize:CGSizeMake(maxW, maxH)];
        
        self.placeholderLabel.frame = CGRectMake(placeholderX, placeholderY, placeholderSize.width, placeholderSize.height);
       
        
    }else{
        self.placeholderLabel.hidden = YES;
    }
    
    self.placeholderLabel.hidden = (placeholder.length == 0);
}

// 设置文本框颜色
-(void)setPlaceholderColor:(UIColor *)placeholderColor
{
    _placeholder = placeholderColor;
    self.placeholderLabel.textColor = placeholderColor;
}

// 设置字体
-(void)setFont:(UIFont *)font{
    [super setFont:font]; // 调用系统的字体
    
    self.placeholderLabel.font = font;
    self.placeholder = self.placeholder;
}

-(void)textDidChange
{
    self.placeholderLabel.hidden = (self.text.length != 0);
    
}

-(void)dealloc
{
    // [NSNotificationCenter removeObserve:self];
}

@end

效果:



© 著作权归作者所有

Corwien
粉丝 27
博文 149
码字总数 115164
作品 0
广州
程序员
私信 提问
使用 Xamarin 开发 iOS 键盘扩展(含网络访问)

版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/...

walter lv
02/24
0
0
QMUI iOS UI 框架正式发布

QMUI iOS QMUI iOS 是一个致力于提高项目 iOS UI 开发效率的解决方案,其设计目是用于辅助快速搭建一个具备基本设计还原效果的 iOS 项目,同时利用自身提供的丰富控件及兼容处理,让开发者能...

kayo5994
2017/01/03
3.9K
2
fir.im Weekly - iOS 开发中的 Git 流程

本期 fir.im Weekly 收集了微博上的热转资源,包含 Android、iOS 开发工具、源码等好用的轮子,还有一些 APP 设计的 Tips,希望对你有用。 精仿知乎日报 iOS 端 @我偏笑_NSNirvana花了将近一...

风起云飞fir_im
2015/11/03
98
0
UI 开发效率解决方案 - QMUI iOS

QMUI iOS 是一个致力于提高项目 UI 开发效率的解决方案,其设计目的是用于辅助快速搭建一个具备基本设计还原效果的 iOS 项目,同时利用自身提供的丰富控件及兼容处理, 让开发者能专注于业务...

kayo5994
2016/12/29
1K
0
关于sdl在ios中输入拼音的问题

做的是ios app,我们现在项目里面用的sdl跨平台,平常开发在windows下,在处理文本输入的时候,英文输入的情况在windows和ios下都没有任何问题,问题出在中文输入上。 在windows下,用拼音输...

hellodudu86
2014/06/28
463
0

没有更多内容

加载失败,请刷新页面

加载更多

读书笔记:深入理解ES6 (五)

第五章 解构:使数据访问更便捷 第1节 为什么使用解构功能?   在ES5中,开发者们从对象、数组中获取特定数据并赋值给变量,编写了很多看起来同质化的代码。例如: 1 let options = {2 ...

张森ZS
22分钟前
19
0
CentOS7 yum方式安装MySQL5.7

在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1 下载并安装MySQL官方的 Yum Repository [root@localho...

roockee
31分钟前
14
0
Allegro三种自定义设置快捷键的方法

Allegro自定义设置快捷键的三种方法: 1、在Allegro PCB editor 命令窗口直接定义 2、通过修改用户变量env文件来设置快捷键 3、定义笔画为快捷键 1、在Allegro PCB editor 命令窗口直接定义 ...

demyar
35分钟前
16
0
如何做一张能让人眼前一亮的大屏?

作为在职场驰骋的社会人,提到数据可视化大家应该都不陌生了。数据可视化的作用也不用我多说,主要是利用图形化手段,更清晰直观地将数据展示。多层次、交互式的可视化分析能够方便决策者理解...

朕想上头条
36分钟前
8
0
TL138/1808/6748-EthEVM开发板硬件CPU、FLASH、RAM

TL138/1808/6748-EthEVM是广州创龙基于SOM-TL138/1808/6748核心板开发的一款开发板,具有三个网络接口。由于SOM-TL138/1808/6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用...

Tronlong创龙
40分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部