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


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

 // 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文件:atom

-(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);
}


  设置文字换行:
spa

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



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

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

IWTextView.m文件:rem

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


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

     
-(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);
}


咱们能够看到,光标已经出如今第一行和提示文字同一行的位置,io


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

实现思路:须要监听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

效果:

相关文章
相关标签/搜索