height = self.vIEw.frame.size.height;wIDth = self.vIEw.frame.size.wIDth;scrollbar = [[UIScrollVIEw alloc] initWithFrame:CGRectMake(0,wIDth,height)];scrollbar.delegate = self;scrollbar.backgroundcolor = [UIcolor whitecolor];scrollbar.maximumZoomScale = 1.0;scrollbar.minimumZoomScale = 1.0;scrollbar.clipsToBounds = YES;scrollbar.showsHorizontalScrollindicator = YES;scrollbar.pagingEnabled = YES;[scrollbar setContentSize:CGSizeMake(wIDth*4,height*4)];[self.vIEw addSubvIEw:scrollbar];for (int i = 1; i <= 4; i++) { first = [[FirstVIEwController alloc]initWithNibname:@"FirstVIEwController" bundle:nil]; first.vIEw.frame = CGRectMake((i-1)*wIDth,height*4); [scrollbar addSubvIEw:first.vIEw]; switch (i) { ase 1: first.vIEw.backgroundcolor = [UIcolor bluecolor]; break; case 2: first.vIEw.backgroundcolor = [UIcolor redcolor]; break; case 3: first.vIEw.backgroundcolor = [UIcolor greencolor]; break; case 4: first.vIEw.backgroundcolor = [UIcolor graycolor]; break; default: break; } }
在我的代码中,我在我的ScrollVIEw中添加了4个不同颜色的视图,现在我想在滚动我的ScrollVIEw上检测dx& dy(dx:Axis.x上的行驶距离& dy:Axis.y上的行驶距离)并检查这两个变量以及何时:
Notic:我希望当任何人触摸ScrollVIEw并在Axis上移动触摸(x或y)或触摸Both Axis(x和y)时检查:
if(dx> dy)禁用水平滚动并在垂直方向移动!!!
否则在水平方向移动并禁用垂直滚动!
- (voID)scrollVIEwDIDScroll:(UIScrollVIEw *)scrollVIEw { CGRect visibleRect = CGRectMake(scrollVIEw.contentOffset.x,scrollVIEw.contentOffset.y,scrollVIEw.contentOffset.x + scrollVIEw.bounds.size.wIDth,scrollVIEw.contentOffset.y + scrollVIEw.bounds.size.height); NSLog(@"%f,%f",visibleRect.origin.x,visibleRect.origin.y); /*NSLog(@"x : %f",scrollVIEw.contentOffset.x); NSLog(@"y : %f",scrollVIEw.contentOffset.y);*/ if (fabsf(scrollVIEw.contentOffset.x) > fabsf(scrollVIEw.contentOffset.y)) { NSLog(@"Vertical SIDe"); } else { NSLog(@"Horizontal SIDe"); }}
请指导我们.我不能禁用一方并移动另一侧!谢谢
解决方法 您可以实现希望向代理添加一些代码的结果.这是我的VIEwController.m文件. -vIEwDIDLoad,#import语句和其他方法被省略.@interface VIEwController () { CGPoint initialOffset; NSInteger direction; // 0 undefined,1 horizontal,2 vertical}@end@implementation VIEwController- (voID)scrollVIEwDIDScroll:(UIScrollVIEw *)scrollVIEw{ // retrIEve current offset CGPoint currentOffset = scrollVIEw.contentOffset; // do we kNow which is the predominant direction? if (direction == 0) { // no. CGfloat dx = currentOffset.x - initialOffset.x; CGfloat dy = currentOffset.y - initialOffset.y; // we need to decIDe in which direction we are moving if (fabs(dx) >= fabs(dy)) { direction = 1; // horizontal } else if (fabs(dy) > fabs(dx)) { direction = 2; } } // ok Now we have the direction. update the offset if necessary if (direction == 1 && currentOffset.y != initialOffset.y) { // remove y offset currentOffset.y = initialOffset.y; // update [scrollVIEw setContentOffset:currentOffset]; } else if (direction == 2 && currentOffset.x != initialOffset.x) { currentOffset.x = initialOffset.x; [scrollVIEw setContentOffset:currentOffset]; }}- (voID)scrollVIEwWillBeginDragging:(UIScrollVIEw *)scrollVIEw{ // store the current offset initialOffset = scrollVIEw.contentOffset; // reset flag direction = 0; // AKA undefined}@end
当您开始拖动时,委托会将标志方向重置为“未知”状态,并存储当前内容偏移量.每次拖动移动后,都会调用-scrollVIEwDIDScroll :.在那里,您决定哪个是主要方向(如果尚未完成)并通过删除x(或y)偏移来相应地校正当前滚动偏移.
我用你提供的相同设置测试了这个,只是我在UIScrollVIEw中使用了UIImageVIEw,我通过InterfaceBuilder设置了一切,但它应该可以正常工作.从理论上讲,使用此方法可以替换directionLock,但请记住-scrollVIEwDIDScroll在 *** 作期间多次调用,并且每次重写内容偏移时(如果滚动在两个方向上进行).因此,如果启用了directionLock,则会保存对委托执行的setContentOffset的许多调用.
总结以上是内存溢出为你收集整理的ios – 滚动时如何在UIScrollView中移动一个方向全部内容,希望文章能够帮你解决ios – 滚动时如何在UIScrollView中移动一个方向所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)