WeChat demo 麦子学院课程笔记 UI部分

三大开源通讯协议:

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()

            defaultcolor = 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)

把整个数据结构传进去,一行即可


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值