三大开源通讯协议:
IMPP 规定草案,实际应用不太多
SIP 主要做语音,后来有扩展
XMPP(Jabber) 全开源 最全面 最普遍 分布式(可以连上任何遵守这个协议的app)很多大公司用
服务器:ejabberd
界面1:登录
1. textfield return 键用法
func textFieldShouldReturn(textfield: UITextField) -> Bool {
if textfield == self.userNameTextField {//换行
self.userNameTextField.resignFirstResponder()
self.passwordTextField.becomeFirstResponder()
}else{//点击“登录”
self.passwordTextField.resignFirstResponder()
self.btnDoneTouchedUpInside()
}
return false
}
2. 带景深的scrollView:不同层次滑动速度不一样
scrollViewDidScroll(){
let offset = scrollView.contentOffset.y / 2
let transform = CGAffineTransformMakeTranslation(offset)//改变的是坐标系,背景坐标系的比例缩小一倍
self.bgImgView.transform = transform
}
3. 点击“登录” 注意事项
(1)检查 textfield 是否为空:self.userNameTextField.text.isEmpty() || self.passwordTextField.text.isEmpty()
(2)砍空格:self.userNameTextField.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())
(3)存储:NSUserDefaults.standardUserDefaults().setValue(userName, forKey: "username")
NSUserDefaults.standardUserDefaults().setValue(password, forKey: "password")
NSUserDefaults.standardUserDefaults().synchronize()
存在本地,与app共存亡,小型数据一般存在NSUserDefaults
(4)登录函数写在appdelegate里面:(UIApplication.sharedApplication().delegate as! AppDelegate).login()
(5)消失:self.dismissViewControllerAnimated()
要判断是否登录成功,是则dismiss,否则return继续登录
界面2 好友列表
1. cell类方法:
(1)好几个controller都需要用的时候,方便改,比如reuseIdentifier
(2)当有参数需要(动态)计算的时候,方便传参,比如heightForCell
2. 字符串根据标识符拆解:假设某string= “***@**@****”,string.componentsSeparatedByString("@")[0],返回 “***”
3. 颜色有关
(1)根据RGB整型数 生成颜色
func UIColorFromRGB(rgbValue: UInt) -> UIColor {
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
}
view.backgroundColor = UIColorFromRGB(0x209624)
(2)生成随机颜色
class func randomColor() -> UIColor {
let numOfColor:UInt32 = 5
let chosenColor = arc4random_uniform(numOfColor)
var color : UIColor?
switch(chosenColor){
case 0: color = UIColor.superLightBlue()//extension class func
case 1: color = UIColor.lightBlue()
case 2: color = UIColor.Blue()
case 3: color = UIColor.darkBlue()
case 4: color = UIColor.superDarkBlue()
default: color = UIColor.blueColor()//system color
}
return color!
}
界面3 聊天室
1. cell高度 根据message长短 动态变化
自定义cell类的类方法
class func heightForCell (message: MessageInfo) -> CGFloat {
let screenRect: CGRect = UIScreen.mainScreen().bounds
//sizeOfString是自己写的extension UILabel类方法
let labelSize: CGSize = UILabel.sizeOfString(message.messageBody!, font: UIFont.systemFontOfSize(16), maxWidth: screenRect.width-avatarSize.width*2-5*2-10*2)
if labelSize.height < avatarSize.height+10 {
return avatarSize.height+10 //cell高度至少应为头像高度+上下余量
}else{
return labelSize.height+5
}
}
使用时直接 MessageCell.heightForCell(self.tableSource.objectAtIndex(indexPath.row) as! MessageInfo)
2. 对话气泡图片的动态变化,边缘不变形的拉伸
extension UIImage {
class func resizableImage (name: String) -> UIImage {
let image = UIImage(name: name)
//相当于大概从中点拉伸
let top = image.size.height*0.6
let bottom = image.size.height*0.5
let LeftOrRight = image.size.height*0.5
return image.resizableImageWithCapInsets(UIEdgeInsets(top: top, left:LeftOrRight, bottom: bottom, right: LeftOrRight))
}
}
3. cell方法 func setupMessageCell (message: MessageInfo, lordUser: UserInfo) {
let labelSize = UILabel.sizeOfString(...)
if message.sender.name == lordUser.name {
//是自己发的,靠右
}else{
//对方发的消息,靠左
}
}
方便在controller里面设置cellForRowAtIndexPath:
cell.setupFriendCell(user: self.tableSource.objectAtIndex(indexPath.row) as! UserInfo)
把整个数据结构传进去,一行即可