【问题标题】:How do you programmatically force a scroll using UIScrollView?您如何以编程方式使用 UIScrollView 强制滚动?
【发布时间】:2011-12-13 20:05:07
【问题描述】:

我有一个 horizo​​ntal UIScrollview 设置(意味着它不是一个上下滚动的,而是一个只左右滚动的)并且在应用程序启动时,我希望这个滚动视图向左滚动,然后是正确的——有点“展示”它的滚动能力——最后停止,让用户接管并用手指手动控制滚动。 一切正常 - 除了这个加载左右演示滚动。

我没有使用 Interface Builder 来做任何事情,我正在用代码做所有事情:

//(this is in viewDidLoad:)
// Create the scrollView:
UIScrollView *photosScroll = [[UIScrollView alloc] initWithFrame: CGRectMake(0, 0, 320, 200)];
[photosScroll setContentSize: CGSizeMake(1240, 200)]; 
// Add it as a subview to the mainView
[mainView addSubview:photosScroll];


// Set the photoScroll's delegate: 
photosScroll.delegate = self;

// Create a frame to which to scroll:   
CGRect frame = CGRectMake(10, 10, 80, 150);
// Scroll to that frame:
[photosScroll scrollRectToVisible: frame animated:YES];

所以 scrollView 加载成功,我可以用手指左右滚动它 - 但它并没有像我希望的那样执行这种“自动滚动”。

  • 我尝试在添加之前和之后调用 scrollRectToVisible scrollView 作为子视图 - 不起作用。
  • 想也许这应该 发生在 loadView 而不是 viewDidLoad 中?但如果是这样,怎么办?

有什么想法吗?

【问题讨论】:

    标签: iphone ios uiscrollview uikit


    【解决方案1】:

    有几种方法可以做到这一点:

    1. scrollRectToVisible:animated: 用于X 值为零,然后是较大的正值,然后将其设置回中间点。您可以在将滚动视图添加为子视图后调用该方法(可能之前也可以,但最好是安全的)。您需要使用 contentSize 计算屏幕左侧的 X 值,并了解滚动视图中各种元素的宽度。
    2. 因为你只是在做一个快速动画并且会给用户控制,这真的是一个快速而肮脏的动画,所以你可以使用setContentOffset:animated:来强制滚动视图的内容相对于你的移动当前视图位置。将元素向右移动以进行左滚动(正 X 值),然后向左移动两倍以进行右滚动(负 X 值),然后将偏移设置回零。

    您不应该将其中任何一个放在viewDidLoadloadView 中;将它们放在viewDidAppear 中,这是在您的滚动视图实际绘制在屏幕上之后。您只关心用户可以看到的动画!

    【讨论】:

    • 你的意思是这样的吗? CGRect 框架 = CGRectMake(800, 0, 800, 150); [photosScroll scrollRectToVisible:帧动画:YES];框架 = CGRectMake(0, 0, 800, 150); [photosScroll scrollRectToVisible:帧动画:YES];因为那不起作用...
    • 对于#1,是的,但是您不需要将frame 滚动到整个视图的大小。如果你愿意,你可以CGRectMake(800, 0, 1, 1),然后CGRectMake(0, 0, 1, 1)。要将区域从 800 像素滚动到 1600 像素到视图中,您可以滚动到 (1599, 0, 1, 1),然后将区域从 0 到 800 滚动到视图中,您可以滚动到 (0, 0, 1, 1)
    • 它工作得很好——但不是 100% :-) 由于 scrollView 是在 viewDidLoad 中分配和初始化的,它只能用于该方法,而不是 viewDidAppear。所以它会滚动到我告诉它在应用程序首次加载时滚动的位置,但它会忽略 viewDidLoad 中的所有其他后续 scrollRectToVisible 命令。我怎样才能在 viewDidLoad 之外访问这个 scrollView 呢?意思是,从 viewDidAppear?
    • 在你的控制器类中创建一个@property (nonatomic) UIScrollView *scrollView;(记住在你的.m文件中@synthesize scrollView;),并在viewDidLoad中将self.scrollView设置为初始化视图。然后你可以从viewDidAppear 引用scrollView :)
    • 听起来不错——但必须等到明天早上 2 点——它现在熄灯了! :-) 同时感谢您的帮助,明天将发布结果!非常感谢。
    猜你喜欢
    • 2011-03-25
    • 1970-01-01
    • 2011-01-15
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多