美文网首页
iOS编程:实现类似微信的对话框

iOS编程:实现类似微信的对话框

作者: 雨如注 | 来源:发表于2015-09-15 15:54 被阅读0次

    今天实现一个类似微信的对话框练手,也算是新手入门,UI的编程伴随很多繁琐的问题,记录在这里。

    问题一:实现点击输入框(UITextField),键盘显示出来时,自动将整个view上浮,当输入结束时,将view再沉下来,这是个非常基础的功能。

    实现方式:

    1. 在viewDidLoad方法中,加入监听键盘出现和隐藏事件:

    //observe keyboard show/hide to move view up/down

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillShow:", name:UIKeyboardWillShowNotification, object:nil)

    NSNotificationCenter.defaultCenter().addObserver(self, selector:"keyboardWillHide:", name:UIKeyboardWillHideNotification, object:nil)

    2. 实现两个事件处理方法:keyboardWillShow/keyboardWillHide

    func keyboardWillShow(aNotification:NSNotification) {

        moveView(aNotification, show:true)

    }

    func keyboardWillHide(aNotification:NSNotification) {

        moveView(aNotification, show:false)

    }

    func moveView(aNotification:NSNotification, show:Bool) {

        let userInfo:NSDictionary= aNotification.userInfo!

        //get which key is really is not important

        let keyboardInfo:AnyObject? = userInfo.objectForKey(UIKeyboardFrameBeginUserInfoKey)

        if let frame = keyboardInfo?.CGRectValue{

            if(show) {

            view.frame.origin.y-= frame.height

            }else{

                view.frame.origin.y+= frame.height

            }

        }

        view.setNeedsDisplay()

    }

    3. 输入完成不应当隐藏键盘,而是用户点击上面对话框的区域(即不点击键盘区域,才隐藏),所以要加一个TapGestureRecognizer,实现方法:

    @IBActionfunctapOnSpace(sender:UITapGestureRecognizer) {

        let tapPoint = sender.view?.frame

        if let origin = (tapPoint?.origin){

            if view.frame.contains(origin){

                talkTextField.resignFirstResponder()

            }

        }

    }

    问题二:实现UITableView中的TableViewCell的大小,随着内容的大小而变化。

    搜了一下网上,都说要实现func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat方法,但后来发现,并不需要这么做。直接在functableView(tableView:UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) ->UITableViewCell里重写cell的大小就OK了。关键在于要调用sizeToFit重算一下大小。

    cell.wordsLabel.sizeToFit()

    问题三:Autolayer布局的问题

    两个label(name和words),左右相邻。设置了name与左边框连接,右边与words连接,words与右边框保持100的距离。系统提示说两个label的位置是“二义”的。原因出在哪里?

    关键在于要设置两个参数:Hugging和Content Compression的Priority。我希望优先显示name的内容,所以它的compression priority要大于words,同时如果有多余空间,我希望给words用,所以它的hugging priority是大于name的。这样就OK了。

    相关文章

      网友评论

          本文标题:iOS编程:实现类似微信的对话框

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