代码之家  ›  专栏  ›  技术社区  ›  mahboudz

UIScrollView按预期工作,但scrollRectToVisible:不执行任何操作

  •  60
  • mahboudz  · 技术社区  · 15 年前

    我用过 UIScrollView scrollToRectVisible 工作。我甚至简化了调用,使其仅移动到0,0位置:

     [scrollView scrollRectToVisible:CGRectMake(0, 0, 10, 10) animated:YES];
    

    或者将其移动到0200:

     [scrollView scrollRectToVisible:CGRectMake(0, 200, 10, 10) animated:YES];
    

    我甚至制作了一个快速应用程序来测试这个,我可以 scrollRectToVisible

    我可以使滚动视图滚动 setContentOffset: ,但那不是我想要的。

    此滚动视图及其内容由IB在nib中定义,并与IBOutlet一起使用。我在应用程序中处理scrollView的唯一代码是

     [scrollView setContentSize:CGSizeMake(scrollView.contentSize.width, imageView.frame.size.height)];
    

    (我只对垂直滚动感兴趣,对水平滚动不感兴趣)。

    有人遇到过这样的问题吗?

    我比较了两个应用程序中的scrollView属性,它们是相同的。

    增编:

    我的滚动视图框架是:0.0000000.000000480.000000179.000000

    我的scrollViews内容大小为:0.000000 324.000000

    这就是我没有钱的生活方式 scrollRectToVisible

    CGPoint point = myRect.origin;
    if (![clefScrollView pointInside:point withEvent:nil]) {
        point.x = 0;
        if (point.y > clefScrollView.contentSize.height - clefScrollView.bounds.size.height)
            point.y = clefScrollView.contentSize.height - clefScrollView.bounds.size.height;
        [clefScrollView setContentOffset:point animated: YES];
    }
    

    scrollRectToVisible . 为什么?有什么猜测吗?

    8 回复  |  直到 12 年前
        1
  •  117
  •   WrightsCS    14 年前

    一个多月后,我终于明白了。虽然上述替代方案效果不错,但它一直困扰着我,我不得不最终找到解决办法。事实证明这是一个愚蠢的错误。

    下面是我的viewDidLoad中的旧代码,我在其中设置了scrollView:

    [clefScrollView setContentSize:CGSizeMake(clefScrollView.contentSize.width, clefView.frame.size.height)];
    

    滚动视图高度或宽度的值不能为0!我想这已经过去了,因为我假设ScrollView的大小从一个有效的大小开始,而我忽略了一个事实,即一个维度是零!

    这项工作:

    [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
    

    希望这能帮助其他人。我确实花了太多时间调试这个。

        2
  •  50
  •   Jonathan Sterling    15 年前

    scrollRectToVisible:animated: 但是 setContentOffset:animated: 总是对我有用。出于好奇,您为什么不想使用 setContentOffset:已设置动画: ? 这似乎是正确的解决办法。

        3
  •  5
  •   Michael Colon    12 年前

    您可能需要检查并查看scrollView delaysContentTouches 属性设置为 NO .

    scrollRectToVisible setContentOffset 如果在scrollView的子视图中进行触摸,则scrollView可能会因延迟触摸而延迟操作。

    因此,请确保在scrollView中设置以下内容。

    scrollView.delaysContentTouches = NO;
    

    您很可能能够在动画设置为“是”和“不设置动画”的情况下移动scrollView。

        4
  •  1
  •   Andro Selva Anand Wadhwani    12 年前

    我就是这样做的,但没用

    scrollView.contentSize = CGSizeMake(scrollView.contentSize.width, someKnownValue);
    

    我只是在改变飞机的高度 contentSize

    必须把它改成这个

    scrollView.contentSize = CGSizeMake(someOtherKnownValue, someKnownValue);
    

    scrollView.contentSize.width

        5
  •  0
  •   aimacworx    14 年前

    如果使用了上述解决方案,但仍然存在相同的问题,请确保在设置内容视图之前已初始化了scollView(在本例中为ScrollView)框架。

    
    
        clefScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,450)];
    
        [clefScrollView setContentSize:CGSizeMake(clefView.frame.size.width, clefView.frame.size.height)];
    
    
    
    
        6
  •  0
  •   user1086279    12 年前

    比赛有点晚了,但我也有同样的问题。尽管我绝对正确地设置了scrollview的内容大小,但高度值设置得也非常正确。即使经过广泛的检查,以验证帧和内容大小-仍然没有工作。我不得不调整“边界”帧的高度,然后一切都很顺利。

        7
  •  0
  •   Swifty    8 年前

        8
  •  0
  •   Vicente Garcia    6 年前

    对我来说,问题是子视图中的约束不是显式的。 检查内容中的每个约束是否已设置,即使布局显然不需要约束。