zoukankan      html  css  js  c++  java
  • tableview直接滚动至最后一行

    类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现。

    在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好。

    1. 调用scrollToRowAtIndexPath方法

    复制代码
     -(void) scrollBottom
     {
         if ([self.messageData count]) {   //messageData是数据源
             NSIndexPath *indexPath=[NSIndexPath indexPathForRow:self.messageData.count-1 inSection:0];
             [self.chatTableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
         }
     }
    复制代码

    2. 改变ContentOffset

    self.chatTableView setContentOffset:CGPointMake(0, self.chatTableView.contentSize.height -self.chatTableView.bounds.size.height) animated:YES];

    不过接下来会遇到一个问题,在什么时候调用它们。

    第一种方法在viewDidLoad和viewWillAppear中不能调用,因为那个时候cell还没生成,会报错,那么在viewDidAppear中调用是可行的,但这样用户点击进去能看到一个下滑的动作,并不好

    第二种方法也一样,在viewDidLoad和viewWillAppear中调用没有效果,只有在viewDidAppear中调用,这样也一样有个下滑的动作。

    解决方法

    最后发现了问题的所在,移动到最后一行只是一个方法而已,点击去滚动条直接在最后一行和这个没有必然的联系。

    这个要看上个页面是通过什么方法进入这个controller的,一般是两种方法。

    1. 通过segue进来,那么默认就是拉倒了最后一行。

    2.通过storyboard初始化viewcontroller然后push,就没有直接拉倒最后一行。我就是用这种方法的,最后的解决办法不是很好,是在

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath这个方法里添加:

    if (self.isFirst) {
            [self scrollBottom]; 
    self.isFirst = NO;
    }

    这样只有点进去的时候会执行,此时页面还没有appear,所以没有下滑的动作就显示在了最后一行

  • 相关阅读:
    flex 和bison的安装和使用
    c++ map
    C++ 值传递、址传递、引用传递
    位运算
    POJ 1185 炮兵阵地 (状压DP)
    POJ 3114 Countries in War(强联通分量+Tarjan)
    Codeforces Round #262 (Div. 2) A B C
    2014多校第十场1002 || HDU 4972 A simple dynamic programming problem
    2014多校第十场1004 || HDU 4974 A simple water problem
    POJ 1144 Network(Tarjan)
  • 原文地址:https://www.cnblogs.com/chenliyang/p/6554385.html
Copyright © 2011-2022 走看看