IOS中带有左右箭头的UIScrollView
Posted
技术标签:
【中文标题】IOS中带有左右箭头的UIScrollView【英文标题】:UIScrollView with left and right arrows in IOS 【发布时间】:2015-03-31 07:23:58 【问题描述】:我有一个 UIScrollView,其中包含一组带有左右按钮的图像。我已经实现了使用此代码移动图像左侧的左键操作
if ( scroll.contentOffset.x <= scroll.frame.size.width )
CGRect frame;
frame.origin.x = scroll.contentOffset.x + scroll.frame.size.width;
frame.origin.y = 0;
frame.size = scroll.frame.size;
//NSLog(@"%f %f %f", frame.origin.y ,scroll.frame.size.width, frame.origin.x);
[scroll scrollRectToVisible:frame animated:YES];
完美运行
同样,我实现了右键操作无法正常工作的功能我做错了什么,代码如下
if ( scroll.frame.size.width <= scroll.contentOffset.x )
CGRect frame;
frame.origin.x = scroll.contentOffset.x - scroll.frame.size.width;
frame.origin.y = 0;
frame.size = scroll.frame.size;
[scroll scrollRectToVisible:frame animated:YES];
【问题讨论】:
可以参考这个链接***.com/questions/2234875/… 我假设滚动视图是水平的,水平意味着改变 x,在这里你将 X 设置为零并计算 Y,并且你正在检查 IF 中的 y 位置 @RaheelSadiq 是的,我正在使用水平滚动更新我的代码。但是当我单击右键时,它会完全滚动 @Ben10 查看答案 在您的代码中,代码在 if 条件块内执行? 【参考方案1】:它应该与左边相反,检查:是否大于,并从当前x位置减去滚动视图宽度
if ( scroll.contentOffset.x >= scroll.frame.size.width )
CGRect frame;
frame.origin.x = scroll.contentOffset.x - scroll.frame.size.width;
frame.origin.y = 0;
frame.size = scroll.frame.size;
//NSLog(@"%f %f %f", frame.origin.y ,scroll.frame.size.width, frame.origin.x);
[scroll scrollRectToVisible:frame animated:YES];
【讨论】:
【参考方案2】:MMm.. 我建议您以另一种方式执行此操作。创建两个按钮和单独的操作方法 rightArrowNavigation, leftArrowNavigation 。在我的代码 currentPage 中添加一个全局 int 值,并在 viewDidLoad 中分配 0。见下文
- (IBAction)rightArrowNavigation:(id)sender
CGRect bounds = self.scrollView.bounds;
bounds.origin.x = CGRectGetWidth(bounds) * (currentPage + 1);
[self.scrollView scrollRectToVisible:bounds animated:YES];
- (IBAction)leftArrowNavigation:(id)sender
CGRect bounds = self.scrollView.bounds;
bounds.origin.x = CGRectGetWidth(bounds) * (currentPage - 1);
[self.scrollView scrollRectToVisible:bounds animated:YES];
【讨论】:
当前页面是什么? 您当前正在查看的页面,您需要按上面代码中此处遗漏的箭头来增加和减少其值。【参考方案3】:对于右键,为什么要检查 contentOffset.y?应该是contentOffset.x,是否也开启了分页?
用这个,我想会解决的
if ( _scroll.contentOffset.x >= _scroll.frame.size.width/2 )
CGRect frame;
frame.origin.x = _scroll.contentOffset.x - _scroll.frame.size.width;
frame.origin.y = 0;
frame.size = _scroll.frame.size;
//NSLog(@"%f %f %f", frame.origin.y ,scroll.frame.size.width, frame.origin.x);
[_scroll scrollRectToVisible:frame animated:YES];
【讨论】:
使用上述测试解决方案。【参考方案4】:左侧功能是正确的,而对于右侧功能,假设您要创建水平滚动条,您应该使用 x 原点和宽度。您的右侧条件和代码应基于 x 原点、宽度,基本上所有负责水平滚动的参数
【讨论】:
【参考方案5】:启用滚动视图分页。如果您不想启用分页,请尝试更多数学运算。
(IBAction)leftButtonClicked:(id)sender
if (self.iTemScrollView.contentOffset.x <
self.iTemScrollView.contentSize.width - self.iTemScrollView.frame.size.width)
[self.iTemScrollView setContentOffset:CGPointMake(self.iTemScrollView .contentOffset.x + self.iTemScrollView .frame.size.width, 0) animated:YES];
(IBAction)rightButtonClicked:(id)sender
NSLog(@" rightbutton self.iTemScrollView.contentOffset.x %f",self.iTemScrollView.contentOffset.x);
NSLog(@"rightbutton self.iTemScrollView.contentOffset.y %f",self.iTemScrollView.contentOffset.y);
if (self.iTemScrollView.contentOffset.x>0)
[self.iTemScrollView setContentOffset:CGPointMake(self.iTemScrollView .contentOffset.x - self.iTemScrollView .frame.size.width, 0) animated:YES];
【讨论】:
【参考方案6】:-(IBAction)leftScroll:(id)sender
//page variable initialize to 0 in view did load method
if(page!=0)
CGRect frame = scrollEvent.frame;
frame.origin.x = frame.size.width * (--page);
frame.origin.y = 0;
[scrollEvent scrollRectToVisible:frame animated:YES];
- (IBAction)rightScroll:(id)sender
if(arrData.count>page)
CGRect frame = scrollEvent.frame;
frame.origin.x = frame.size.width * (++page);
frame.origin.y = 0;
[scrollEvent scrollRectToVisible:frame animated:YES];
【讨论】:
以上是关于IOS中带有左右箭头的UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章
Java 8 中带有 2 个箭头的 lambda 是啥意思?
pyqtgraph中带有箭头的自定义LinearRegionItem
setState Dart/Flutter 中带有花括号的胖箭头符号