iOS开发常用tips记录

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)
        }
iOS开发常用tips记录_第1张图片
image.png

iOS开发常用tips记录_第2张图片
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获取模型的属性列表然后给属性赋值

iOS开发常用tips记录_第3张图片
获取属性列表

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

你可能感兴趣的:(iOS开发常用tips记录)