新浪微博客户端(38)-显示键盘上的工具条

DJComposeToolbar.m

#import "DJComposeToolbar.h"

@implementation DJComposeToolbar



- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        
        
        self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"compose_toolbar_backgrounds"]];
        
        [self setupBtnWithImage:@"compose_camerabutton_background" hilightImage:@"compose_camerabutton_background_highlighted"];
        [self setupBtnWithImage:@"compose_toolbar_picture" hilightImage:@"compose_toolbar_picture_highlighted"];
        [self setupBtnWithImage:@"compose_mentionbutton_background" hilightImage:@"compose_mentionbutton_background_highlighted"];
        [self setupBtnWithImage:@"compose_trendbutton_background" hilightImage:@"compose_trendbutton_background_highlighted"];
        [self setupBtnWithImage:@"compose_emoticonbutton_background" hilightImage:@"compose_emoticonbutton_background_highlighted"];
        
    }
    return self;
}




- (void)setupBtnWithImage:(NSString *)image hilightImage:(NSString *)hilightImage {

    UIButton *btn = [[UIButton alloc] init];
    [btn setImage:[UIImage imageNamed:image] forState:UIControlStateNormal];
    [btn setImage:[UIImage imageNamed:hilightImage] forState:UIControlStateHighlighted];
    
    [self addSubview:btn];

}



- (void)layoutSubviews {

    [super layoutSubviews];
    
    NSUInteger count = self.subviews.count;
    CGFloat btnY = 0;
    CGFloat btnW = self.width / count;
    CGFloat btnH = self.height;
    for (int i = 0; i < count; i++) {
        UIButton *btn = self.subviews[i];
        btn.x = i * btnW;
        btn.y = btnY;
        btn.width = btnW;
        btn.height = btnH;
    }
    
}



@end

DJComposeViewControll.m

#import "DJComposeViewController.h"
#import "DJAccountTool.h"
#import "DJTextView.h"
#import "AFHTTPSessionManager.h"
#import "MBProgressHUD+MJ.h"
#import "DJComposeToolbar.h"



@interface DJComposeViewController() <UITextViewDelegate>

@property (nonatomic,weak) DJTextView *textView;
@property (nonatomic,weak) DJComposeToolbar *toolbar;


@end

@implementation DJComposeViewController




- (void)viewDidLoad {

    [super viewDidLoad];
    [self initNavigationView];
    [self initTextView];
    [self initComposeToolbar];
}



- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
     self.navigationItem.rightBarButtonItem.enabled = NO;
    
}


/** 初始化工具条 */
- (void)initComposeToolbar {

    DJComposeToolbar *toolbar = [[DJComposeToolbar alloc] init];
    toolbar.width = self.view.width;
    toolbar.height = 44;
    toolbar.x = 0;
    toolbar.y = self.view.height - toolbar.height;
    [self.view addSubview:toolbar];
    self.toolbar = toolbar;
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrameNotification:) name:UIKeyboardWillChangeFrameNotification object:nil];
    
}





/** 初始化NavigationView */
- (void)initNavigationView {

    self.view.backgroundColor = [UIColor whiteColor];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleDone target:self action:@selector(finish)];
    
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"发送" style:UIBarButtonItemStylePlain target:self action:@selector(send)];
    
    
    
    
    UILabel *titleView = [[UILabel alloc] init];
    titleView.width = 200;
    titleView.height = 44;
    titleView.numberOfLines = 0; // 设置titleView 为多行显示
    titleView.textAlignment = NSTextAlignmentCenter;
    
    DJAccount *account = [DJAccountTool account];
    NSString *nickName = account.screen_name;
    NSString *prefix = @"发微博";
    NSString *str = [NSString stringWithFormat:@"%@
%@",prefix,nickName];
    NSRange nick_name_range = [str rangeOfString:nickName];
    NSRange prefix_range = [prefix rangeOfString:prefix];
    
    NSMutableAttributedString *titleStr = [[NSMutableAttributedString alloc] initWithString:str];
    [titleStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:13] range:nick_name_range];
    [titleStr addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:15] range:prefix_range];
    
    
    titleView.attributedText = titleStr;
    self.navigationItem.titleView = titleView;
    
}



/** 初始化输入区域 */
- (void)initTextView {

    DJTextView *textView = [[DJTextView alloc] init];
    textView.frame = self.view.bounds;
    textView.font = [UIFont systemFontOfSize:14];
    textView.placeholder = @"请输入微博内容";
    textView.placeholderColor = [UIColor grayColor];
    textView.alwaysBounceVertical = YES;
    [self.view addSubview:textView];
    self.textView = textView;
    textView.delegate = self; // 类似于android里面的setOnClickListener(this)方法
    
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textHasChange) name:UITextViewTextDidChangeNotification object:textView];

}



- (void)finish {

    [self dismissViewControllerAnimated:YES completion:nil];
    
}


/** 监听TextView文本改变 */
- (void)textHasChange {
    
    // 若用户已经为textView输入了文本,则发送按钮可点击
    self.navigationItem.rightBarButtonItem.enabled = self.textView.hasText;

}


/** 发微博 */
- (void)send {

    [self sendStatusRequest];
    
}



/** 发微博 */
- (void)sendStatusRequest {

    AFHTTPSessionManager *RequestManager = [AFHTTPSessionManager manager];
    NSString *urlString = @"https://api.weibo.com/2/statuses/update.json";
    
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"access_token"] = [DJAccountTool account].access_token;
    params[@"status"] = self.textView.text;
    
    [RequestManager POST:urlString parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [MBProgressHUD showSuccess:@"发送成功"];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [MBProgressHUD showError:@"发送失败"];
    }];
    [self dismissViewControllerAnimated:YES completion:nil];
}


#pragma mark - 接收键盘frame改变通知(类似于android中的接收广播)
- (void)keyboardWillChangeFrameNotification:(NSNotification *)notification {
    NSDictionary *intent = notification.userInfo;
    // 键盘的frame
    CGRect keyboardF = [intent[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    // 动画的执行时间
    double duration = [intent[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    
    [UIView animateWithDuration:duration animations:^{
        self.toolbar.y = keyboardF.origin.y - self.toolbar.height;
    }];
    
}



#pragma mark - ScrollView 代理方法(当用户拖动TextView时使键盘消失)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [self.view endEditing:YES];

}


- (void)dealloc {

    [[NSNotificationCenter defaultCenter] removeObserver:self];

}



@end

最终效果:

原文地址:https://www.cnblogs.com/yongdaimi/p/6102877.html