我有一个带有多个视图的UIScrollView
。当用户用手指轻扫屏幕时,视图会根据轻扫的方向向右或向左滚动。基本上,我的代码与iPhone照片应用程序类似。现在,有没有一种方法可以通过编程方式做同样的事情,以便我最终得到一个幻灯片演示文稿,只需点击一个按钮,并且可以配置每次滚动之间的暂停时间?
如何使用UIScrollView
制作幻灯片演示文稿?
我有一个带有多个视图的UIScrollView
。当用户用手指轻扫屏幕时,视图会根据轻扫的方向向右或向左滚动。基本上,我的代码与iPhone照片应用程序类似。现在,有没有一种方法可以通过编程方式做同样的事情,以便我最终得到一个幻灯片演示文稿,只需点击一个按钮,并且可以配置每次滚动之间的暂停时间?
如何使用UIScrollView
制作幻灯片演示文稿?
你可以使用以下Objective-C语句之一,在滚动视图中滚动到某个点:
[scrollView setContentOffset:CGPointMake(x, y) animated:YES];
或者Swift
scrollView.setContentOffset(CGPoint(x: x, y: y), animated: true)
参考 Apple 的《滚动滚动视图内容》指南,学习使用 UIScrollView
制作幻灯片。
制作幻灯片的方法是将所有图片排列在滚动视图中,设置重复定时器,然后在定时器触发时使用-setContentOffset:animated:
方法来滚动视图。
但效率更高的方法是使用两个图像视图并在计时器触发时进行过渡或简单地切换它们的位置。详情请参见iPhone 图像幻灯片。
如果您想控制动画的持续时间和样式,可以这样做:
[UIView animateWithDuration:2.0f delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
scrollView.contentOffset = CGPointMake(x, y);
} completion:NULL];
根据个人口味调整持续时间 (2.0f
) 和选项 (UIViewAnimationOptionCurveLinear
)!
我很惊讶这个主题已经有9年历史了,而真正简单明了的答案还没有出现!
你要找的是scrollRectToVisible(_:animated:)
。
示例:
extension SignUpView: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
scrollView.scrollRectToVisible(textField.frame, animated: true)
}
}
它所做的正是您需要的,而且比使用hacky contentOffset
的方法要好得多。
该方法滚动内容视图,以便定义为矩形的区域刚好可见于滚动视图内。如果该区域已经可见,则该方法不执行操作。
来源:https://developer.apple.com/documentation/uikit/uiscrollview/1619439-scrollrecttovisible
另一种方法是
scrollView.contentOffset = CGPointMake(x,y);
CGPoint
应更改为 CGPointMake
。 - Evan Mulawski使用 Swift 进行动画
scrollView.setContentOffset(CGPointMake(x, y), animated: true)
Swift 3
let point = CGPoint(x: 0, y: 200) // 200 or any value you like.
scrollView.contentOffset = point
scrollView.setContentOffset(CGPoint(x: y, y: x), animated: true)
[Scrollview setContentOffset:CGPointMake(x, y) animated:YES];
- (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 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。
(myScrollView.contentOffset.x +320)
。 - Giovanni(myScrollView.contentOffset.x +320)
! - DD_contentOffset:
дјҡеҗҢж—¶еҒҸ移contentSize
пјҢиҝҷеҸҜиғҪдёҚжҳҜжҲ‘们жғіиҰҒзҡ„гҖӮеҰӮжһңеҸӘжғіж»ҡеҠЁеҶ…е®№пјҢдҪ еҸҜиғҪйңҖиҰҒдҪҝз”ЁscrollRectToVisible:
гҖӮ - ChrisCGPointMake
。直接构建一个Swift结构体:CGPoint(x: 0, y: 44)
。 - Arnold