简体   繁体   English

UIScrollView setContentOffset:动画:不工作

[英]UIScrollView setContentOffset: animated: not working

I have a problem with two infinite UIScrollViews which do not change their offsets properly.我有两个无限 UIScrollViews 的问题,它们没有正确更改它们的偏移量。

An item in the first UIScrollView corresponds with another one in the second.第一个 UIScrollView 中的一个项目与第二个中的另一个项目相对应。 Then, I want to put the clicked item in the second place and animate the change in both UIScrollView.然后,我想将点击的项目放在第二位,并对 UIScrollView 的变化进行动画处理。 To get this done properly, I use this two methods:为了正确完成这项工作,我使用以下两种方法:

When item is clicked:单击项目时:

- (void)click:(id)sender {
    NSInteger index = [[self cells] indexOfObject:sender];
    if (index == 1)
    {
        CategoriesViewController *viewController = [[CategoriesViewController alloc] initWithNibName:@"CategoriesView" bundle:nil];

        [[viewController tit] setText:NSLocalizedString([[self categories] objectAtIndex:1], nil)];

        [[self navigationController] pushViewController:viewController animated:YES];
    }
    else
    {
        for (NSInteger i = 0; i < index - 1; i++)
        {
            NSObject *object = [[self categories] objectAtIndex:0];
            [[self categories] removeObjectAtIndex:0];
            [[self categories] addObject:object];
        }

        for (NSInteger i = 0; i < index - 1; i++)
        {
            CollectionCellViewController *cell = [[self cells] objectAtIndex:0];
            [[self cells] removeObjectAtIndex:0];
            [[self cells] addObject:cell];
        }

        for (NSInteger i = 0; i < index - 1; i++)
        {
            UIImageView *image = [[self images] objectAtIndex:0];
            [[self images] removeObjectAtIndex:0];
            [[self images] addObject:image];
        }

        [self updateViewsOffsets];
    }
}

- (void)updateViewsOffsets {
    NSInteger y = 0;
    for (NSInteger i = 0; i < [[self cells] count]; i++)
    {
        CollectionCellViewController *cell = [[self cells] objectAtIndex:i];

        [[cell view] setTag:i];
        if (i == 1)
        {
            [cell setSelected:[[self categories] objectAtIndex:i]];
        }
        else
        {
            [cell setDeselected:[[self categories] objectAtIndex:i]];
        }

        CGRect rect = [[cell view] frame];
        rect.origin.x = 0.0f;
        rect.origin.y = y;
        [[cell view] setFrame:rect];
        y += [[self table] frame].size.height / 2.0f;
    }

    y = 0;
    for (NSInteger i = 0; i < [[self images] count]; i++)
    {
        UIImageView *image = [[self images] objectAtIndex:i];
        CGRect rect = [image frame];
        rect.origin.x = 0.0f;
        rect.origin.y = y;
        [image setFrame:rect];
        y += [[self gallery] frame].size.height;
    }

    [[self table] setContentOffset:CGPointMake(0.0f, [[self table] frame].size.height / 2.0f) animated:YES];
    [[self gallery] setContentOffset:CGPointMake(0.0f, [[self table] contentOffset].y * 8.0f) animated:YES];
}

The change is made, but without animation, it have the same behaviour with YES or NO, it only calls scrollViewDidScroll: once.进行了更改,但没有 animation,它与 YES 或 NO 具有相同的行为,它只调用 scrollViewDidScroll: 一次。 However, I use setContentOffset: animated: in other methods where it works properly with both UIScrollView.但是,我在其他方法中使用 setContentOffset: animated: 在它与 UIScrollView 一起正常工作的其他方法中。

Any idea, please.请有任何想法。 Thank you very much in advance.非常感谢您提前。

I just had this issue.我刚遇到这个问题。 I fixed it by dispatching the call to the main thread.我通过将调用调度到主线程来修复它。 Try this:尝试这个:

dispatch_async(dispatch_get_main_queue(), ^{
    [[self table] setContentOffset:CGPointMake(0.0f, [[self table] frame].size.height / 2.0f) animated:YES];
    [[self gallery] setContentOffset:CGPointMake(0.0f, [[self table] contentOffset].y * 8.0f) animated:YES];
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM