如何将UITableView滚动到特定位置

时间:2011-05-02 11:13:21

标签: iphone objective-c cocoa-touch uitableview uiscrollview

如何将表格的单元格滚动到特定位置?我有一个表格显示3行(根据高度)。我想要的是如果我点击第1行而不是根据表格的高度,第1行应该滚动并获得新位置(中心),并且对于其他行也是如此。我试过contenOffset但是没有用..

已编辑:

简而言之,当我们选择选择器中的任何行时,数据选择器就会滚动到中心。

谢谢..

8 个答案:

答案 0 :(得分:133)

它应该使用- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UITableViewScrollPosition)scrollPosition animated:(BOOL)animated以这种方式使用它:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[yourTableView scrollToRowAtIndexPath:indexPath 
                     atScrollPosition:UITableViewScrollPositionTop 
                             animated:YES];

atScrollPosition可以采用以下任何值:

typedef enum {
UITableViewScrollPositionNone,
UITableViewScrollPositionTop,
UITableViewScrollPositionMiddle,
UITableViewScrollPositionBottom
} UITableViewScrollPosition;

我希望这有助于你

干杯

答案 1 :(得分:17)

[tableview scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];

这将把你的tableview带到第一行。

答案 2 :(得分:15)

最后我发现......当表格只显示3行时,它会很好用...如果行更多则应该相应更改......

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{    
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView 
 numberOfRowsInSection:(NSInteger)section
{  
    return 30;
}

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {         
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault    
                                       reuseIdentifier:CellIdentifier] autorelease];
    }

    // Configure the cell.
    cell.textLabel.text =[NSString stringWithFormat:@"Hello roe no. %d",[indexPath row]];

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * theCell = (UITableViewCell *)[tableView     
                                              cellForRowAtIndexPath:indexPath];

    CGPoint tableViewCenter = [tableView contentOffset];
    tableViewCenter.y += myTable.frame.size.height/2;

    [tableView setContentOffset:CGPointMake(0,theCell.center.y-65) animated:YES];
    [tableView reloadData]; 
 }

答案 3 :(得分:14)

使用[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:scrollPosition animated:YES]; 滚动接收器,直到索引路径标识的行位于屏幕上的特定位置。

scrollToNearestSelectedRowAtScrollPosition:animated:

滚动表格视图,使最接近表格视图中指定位置的选定行位于该位置。

答案 4 :(得分:8)

Swift 4.2版本:

let indexPath:IndexPath = IndexPath(row: 0, section: 0)
self.tableView.scrollToRow(at: indexPath, at: .none, animated: true)

枚举:这些是可用的tableView滚动位置 - 此处供参考。您不需要在代码中包含此部分。

public enum UITableViewScrollPosition : Int {

case None
case Top
case Middle
case Bottom
}

DidSelectRow:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let theCell:UITableViewCell? = tableView.cellForRowAtIndexPath(indexPath)

    if let theCell = theCell {
        var tableViewCenter:CGPoint = tableView.contentOffset
        tableViewCenter.y += tableView.frame.size.height/2

        tableView.contentOffset = CGPointMake(0, theCell.center.y-65)
        tableView.reloadData()
    }

}

答案 5 :(得分:1)

值得注意的是,如果使用setContentOffset方法,可能会导致表视图/集合视图跳转一点。老实说,我会尝试另一种方式。建议使用免费提供的滚动视图委托方法。

答案 6 :(得分:0)

只需一行代码:

import jdk.incubator.http.HttpClient;
import jdk.incubator.http.HttpRequest;
import jdk.incubator.http.HttpResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

public class ReqSingle {

    private float totalElapsedTime = 0F;
    private HttpClient client = HttpClient.newHttpClient();

    public ReqSingle(String[] sties){
        for (String site : sties){
            long fetchStartTime = System.currentTimeMillis();
            String html = getResource(site);
            float elapsed = (float) (System.currentTimeMillis() - fetchStartTime) / 1000;

            Document doc = Jsoup.parse(html);
            System.out.println("It took " + elapsed + " seconds to fetch " + site + " with title " + doc.title());
            totalElapsedTime += elapsed;
        }

        System.out.println("Total Elapsed Time: " + totalElapsedTime + "\nTotal Number of sites: " + sties.length);
    }

    private String getResource(String someUrl) {
        String body = "";
        try {
            URI url = new URI(someUrl);
            HttpRequest request = HttpRequest.newBuilder()
                    .uri(url).GET().build();
            HttpResponse<String> response = client.send(request, HttpResponse.BodyHandler.asString());
            body = response.body();
        } catch (URISyntaxException e) {
            System.out.println("URL " + someUrl + "is not valid");
        } catch (IOException | InterruptedException e) {
            // do nothing
        }
        return body;
    }
}

答案 7 :(得分:0)

如果你的表视图只有一行和一节,你也可以使用以下方法

 challengeInfoTableView.scrollRectToVisible(challengeInfoCell.challengeDescriptionTextView!.frame, animated: false)

在这种情况下,您可以直接滚动到正确的文本字段、文本视图、标签等。