• 新浪微博客户端(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

    最终效果:

  • 相关阅读:
    metasploit-shellcode生成
    项目中遇到了docker、PaaS、k8s,它们之间的关系是怎么样的呢?
    docker是什么?它里面放着什么?
    java排序算法总结
    java类加载机制
    JVM垃圾回收算法
    跳出循环几种方式
    数据库分片分库常见问题解决方案
    数据库优化
    SQL生命周期
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/6102877.html
Copyright © 2020-2023  润新知