美文网首页iOS日常
iOS开发常用tips记录

iOS开发常用tips记录

作者: BigBowen | 来源:发表于2018-02-01 11:38 被阅读5次

    1.获取textfield的最新内容及限制是否给用户输入:

     func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
            /**
             *range
             *当前被编辑的范围
             *range.location:当前被编辑的位置,当有新内容输入时,表示新内容的位置,当按下delete时,表示被delete的内容发位置
             *range.length:当前被编辑内容的长度,当有新内容输入时,表示新内容的长度,当按下delete时,长度为0
             *
             *string
             *输入的新内容,当有新内容输入时,表示新的内容,当按下delete时,内容为""
             */
            
            //判断最新内容的长度可以使用以下方法:
            let length = textField.text?.length + range.length
            
            //获取最新内容可以使用:
            let str = textField.text + string
            
        }
    

    2.如何让聊天输入框与键盘紧密贴合:

    前提准备:监听键盘frame的改变UIKeyboardWillChangeFrame,拿到键盘通知携带的Notification
    代码实现:

    func updateKeyboardProperties(_ sender: Notification) {
            
            var dict = sender.userInfo!
            //获取键盘size
            guard let rect = (dict[UIKeyboardFrameEndUserInfoKey]! as AnyObject).cgRectValue else { return }
            //获取键盘弹出时间
            guard let duration = (dict[UIKeyboardAnimationDurationUserInfoKey]! as AnyObject).doubleValue else { return }
            //获取键盘动画的方式
            let keyboardAnimationCurve = (dict[UIKeyboardAnimationCurveUserInfoKey]! as AnyObject).uintValue
            let options = UIViewAnimationOptions(rawValue: keyboardAnimationCurve!)
            //按照键盘的动画时间及方式执行动画
            UIView.animate(withDuration: duration, delay: 0, options: options, animations: {
                self.replyContainerView.transform = CGAffineTransform(translationX: 0, y: -(rect.height + self.replyContainerView.h))
            }, completion: nil)
        }
    

    3.UILabel水平方向之后跟随有其它控件时:

    由于UILabel重写了系统的intrinsicContentSize,它会在确定内容的时候自己给出size,我们只需其位置即可,所以在水平方向有其它控件时,善于利用content Hugging(抗拉伸)与content Compression Resistance(抗压缩),例如要求字数少时控件紧跟label,字数多时压缩label.后面的控件显示正常:

    //750
     self.nameLabel.setContentHuggingPriority(UILayoutPriorityDefaultHigh, for: UILayoutConstraintAxis.horizontal)
    //250     
    self.nameLabel.setContentCompressionResistancePriority(UILayoutPriorityDefaultLow, for: UILayoutConstraintAxis.horizontal)
            // 名字
            self.nameLabel.snp.makeConstraints { (make) in
                make.top.equalTo(self.avatarImageView)
                make.left.equalTo(self.avatarImageView.snp.right).offset(margin10)
                make.height.equalTo(16)
            }
            self.imageV1.snp.makeConstraints { (make) in
                make.centerY.equalTo(self.nameLabel)
                make.width.height.equalTo(15)
                make.left.equalTo(self.nameLabel.snp.right).offset(2)
            }
            self.imageV2.snp.makeConstraints { (make) in
                make.centerY.equalTo(self.nameLabel)
                make.width.height.equalTo(15)
                make.left.equalTo(self.imageV1.snp.right).offset(2)
             //优先级介于750和250之间
                make.right.equalToSuperview().offset(-5).priority(500)
            }
    
    image.png
    image.png

    4.使用sd时,同一个URL的图片被更换了怎么办?

    • 干架--哈哈,开玩笑的
    • 如果后台要更换,建议他把url也更换掉
    • 选择正确的模式,设置headersFilter
    //设置headersFilter
    SDWebImageDownloader *imgDownloader = SDWebImageManager.sharedManager.imageDownloader;  
    imgDownloader.headersFilter  = ^NSDictionary *(NSURL *url, NSDictionary *headers) {  
      //返回与后台协商好的header
    };  
    NSURL *url = [NSURL URLWithString:@"..."];  
    [[self imageV] sd_setImageWithURL:url  
                        placeholderImage:nil  
                                 options:SDWebImageRefreshCached];
    

    解释一下:
    在请求图片的时候,我们可以看到响应的header中会带有Last-Modified与对应的时间戳的键值对


    image.png

    我们可以根据这个来判别图片是否需要更新,流程是:第一次请求时,保存Last-Modified对应的value-->下一次发送图片请求的时候在header里添加一个上一次图片更换的时间戳键值对,例如Image-Modified: timestamp,timestamp为上一次请求图片的时间戳-->服务器收到请求时,对比Last-Mdodified与请求传过来的Image-Modified的时间,如果Last-Mdodified时间比较新时返回最新的图片数据,反之则不用返回图片数据-->客户端收到响应时,如果收到了图片数据,则更新Image-Modified与图片,反之则都不需要.

    5.swift使用MJExtension的坑:

    使用mj_object(withKeyValues: dataDic)的过程中发现转换成的模型并没有值,通过查看MJExtension得知,框架通过runtime获取模型的属性列表然后给属性赋值

    获取属性列表

    如果模型的属性声明为 var age = 0 时,并不能被获取到,需要在属性名前加@objc就可以被获取到了.

    相关文章

      网友评论

        本文标题:iOS开发常用tips记录

        本文链接:https://www.haomeiwen.com/subject/ogsaaxtx.html