以编程方式滚动 UIScrollView

我有一个 UIScrollView有几个意见。当用户轻弹手指时,视图会根据轻弹手指的方向向左或向右滚动。基本上,我的代码的工作方式类似于 iPhone 的照片应用程序。现在,有没有一种方法,我可以通过编程来做同样的事情,以便我最终的幻灯片运行自己的点击一个按钮和一个可配置的暂停之间的每个滚动?

如何使用 UIScrollView进行幻灯片放映?

193810 次浏览

您可以使用 Objective-C 中的下列语句之一滚动到滚动视图中的某个点

[scrollView setContentOffset:CGPointMake(x, y) animated:YES];

或者斯威夫特

scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true)

看看 滚动来自 Apple 的滚动视图内容指南

要使用 UIScrollView进行幻灯片放映,您需要在滚动视图中排列所有图像,设置一个重复计时器,然后在计时器触发时使用 -setContentOffset:animated:

但是一个更有效的方法是使用2个图像视图,并交换它们使用过渡或简单地切换位置时,定时器触发。详情请参阅 IPhone 图片幻灯片

另一种方式是

scrollView.contentOffset = CGPointMake(x,y);

如果你想控制动画的持续时间和风格,你可以这样做:

[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
scrollView.contentOffset = CGPointMake(x, y);
} completion:NULL];

调整持续时间(2.0f)和选项(UIViewAnimationOptionCurveLinear)的味道!

- (void)viewDidLoad
{
[super viewDidLoad];
board=[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.view.frame.size.height, 80)];
board.backgroundColor=[UIColor greenColor];
[self.view addSubview:board];
// Do any additional setup after loading the view.
}




-(void)viewDidLayoutSubviews
{




NSString *str=@"ABCDEFGHIJKLMNOPQRSTUVWXYZ";


index=1;
for (int i=0; i<20; i++)
{
UILabel *lbl=[[UILabel alloc]initWithFrame:CGRectMake(-50, 15, 50, 50)];
lbl.tag=i+1;
lbl.text=[NSString stringWithFormat:@"%c",[str characterAtIndex:arc4random()%str.length]];
lbl.textColor=[UIColor darkGrayColor];
lbl.textAlignment=NSTextAlignmentCenter;
lbl.font=[UIFont systemFontOfSize:40];
lbl.layer.borderWidth=1;
lbl.layer.borderColor=[UIColor blackColor].CGColor;
[board addSubview:lbl];
}


[NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(CallAnimation) userInfo:nil repeats:YES];


NSLog(@"%d",[board subviews].count);
}




-(void)CallAnimation
{


if (index>20) {
index=1;
}
UIView *aView=[board viewWithTag:index];
[self doAnimation:aView];
index++;
NSLog(@"%d",index);
}


-(void)doAnimation:(UIView*)aView
{
[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveLinear  animations:^{
aView.frame=CGRectMake(self.view.frame.size.height, 15, 50, 50);
}
completion:^(BOOL isDone)
{
if (isDone) {
//do Somthing
aView.frame=CGRectMake(-50, 15, 50, 50);
}
}];
}

在 Swift 中使用动画

scrollView.setContentOffset(CGPointMake(x, y), animated: true)
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];

Swift 3

let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
scrollView.contentOffset = point

我很惊讶,这个话题是9岁,而实际的直截了当的答案不在这里!

你要找的是 scrollRectToVisible(_:animated:)

例如:

extension SignUpView: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
scrollView.scrollRectToVisible(textField.frame, animated: true)
}
}

它所做的正是你所需要的,而且它远远好于骇客 contentOffset

此方法滚动内容视图,以便 rect 定义的区域 仅在滚动视图中可见。如果该区域已经 可见的情况下,该方法不执行任何操作。

发信人: https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible

这里是另一个对我很有用的用例。

  1. 用户点击按钮/单元格。
  2. 滚动到刚好可以看到目标视图的位置。

密码: 斯威夫特5.3

// Assuming you have a view named "targeView"
scrollView.scroll(to: CGPoint(x:targeView.frame.minX, y:targeView.frame.minY), animated: true)

正如您可以猜测的那样,如果您想要滚动以使目标视图的底部可见,那么可以使用 maxX 和 minY。