UIScrollView - 像UIPickerView一样选择

时间:2011-12-04 11:17:58

标签: iphone objective-c ios xcode uiscrollview


我的UIScrollView有两个小问题。 我设法创建了滚动视图,它与拾取器视图类似,只是它是水平的
问题n.1 是 - 如何获取用户点击的号码?
问题n.2 是 - 如何使滚动视图四处转动 - 永无止境?
一个问题 - 是否可以制作一些“选择指标”?

这是我的代码:

  

numberArray = [NSArray arrayWithObjects:@“1”,@“2”,@“3”,@“4”,@“5”,   @“6”,@“7”,@“8”,@“9”,@“10”,@“11”,@“12”,@“13”,@“14”,@“15”,   @“16”,@“17”,@“18”,@“19”,@“20”,@“21”,@“22”,@“23”,@“24”,@“25”,   @“26”,@“27”,@“28”,@“29”,@“30”,@“31”,@“32”,@“33”,@“34”,@“35”,   @“36”,@“37”,@“38”,@“39”,@“40”,@“41”,@“42”,@“43”,@“44”,@“45”,   @“46”,@“47”,@“48”,@“49”,@“50”,@“51”,@“52”,@“53”,@“54”,@“55”,   @“56”,@“57”,@“58”,@“59”,@“60”,@“61”,@“62”,@“63”,@“64”,@“65”,   @“66”,@“67”,@“68”,@“69”,@“70”,@“71”,@“72”,@“73”,@“74”,@“75”,   @“76”,@“77”,@“78”,@“79”,@“80”,@“81”,@“82”,@“83”,@“84”,@“85”,   @“86”,@“87”,@“88”,@“89”,@“90”,@“91”,@“92”,@“93”,@“94”,@“95”,   @“96”,@“97”,@“98”,@“99”,@“100”,nil];

masterDividerView = [[UIView alloc] initWithFrame:CGRectMake(0, 480, 320, 44)];

morePeople = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 53)];
morePeople.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
morePeople.delegate = self;
[morePeople setBackgroundColor:[UIColor whiteColor]];

[morePeople setCanCancelContentTouches:NO];

morePeople.showsHorizontalScrollIndicator = NO;
morePeople.showsVerticalScrollIndicator = NO;
morePeople.clipsToBounds = NO;
morePeople.scrollEnabled = YES;
morePeople.pagingEnabled = NO;

NSUInteger nimages = 0;
NSInteger tot=0;
CGFloat cx = 0;
for (; ; nimages++) {
    NSString *label = [numberArray objectAtIndex:nimages];

    if (tot==99) {
        break;
    }
    if (99==nimages) {
        nimages=0;
    }

    UILabel *labelView = [[UILabel alloc] init];
    labelView.text = label;
    labelView.lineBreakMode = UILineBreakModeWordWrap;
    labelView.numberOfLines = 0;
    [labelView sizeToFit];
    labelView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];


    CGRect rect = labelView.frame;
    rect.size.height = 53;
    rect.size.width = 40;
    rect.origin.x = cx;
    rect.origin.y = 0;

    labelView.frame = rect;

    [morePeople addSubview:labelView];

    cx += labelView.frame.size.width+5;
    tot++;
}


self.pageControl.numberOfPages = nimages;
[morePeople setContentSize:CGSizeMake(cx, [morePeople bounds].size.height)];

[masterDividerView addSubview:morePeople];
[self.view addSubview:masterDividerView];

如果有人知道一个很好的解决方案,我会非常高兴!!!! :))

2 个答案:

答案 0 :(得分:2)

你的问题太广了,无法做出详细的答案,但是,你所谈论的一切都可以通过一种非常简单的方式解决。

  

问题n.1是 - 如何获取用户点击的号码?

如果你想知道你的UIScrollView目前选择了什么元素,那么这不是问题:UIScrollView总是知道它的位置(contentOffset),这使你可以很容易地定义,选择哪个对象(哪个对象)你现在正在和你合作。

如果您想知道用户何时用手指轻敲“选择器视图”(UIScrollView)中的一个元素,那么我会说答案取决于您实际代表数据的方式(如果您在屏幕上一次查看scrollView的一个或多个元素)。但无论如何,您可以使用UITapGestureRecognizer轻松解决此问题。 Smth喜欢:

// add gesture recognizers to the scroll view 
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[singleTap setNumberOfTapsRequired:1];
[self.yourScrollView addGestureRecognizer:singleTap];
[singleTap release];

然后在您的选择器中以编程方式滚动它,就像:

- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer
{
    CGPoint pointOfTouch = [gestureRecognizer locationInView:self.view];
    if ( (pointOfTouch.x > self.rightArrowMin) && (pointOfTouch.x < self.rightArrowMax) ) {
        [scrollView setContentOffset:CGPointMake(lastOffset + self.lengthOfLabel, 0) animated:YES];
    } else if ( (pointOfTouch.x > self.leftArrowMin) && (pointOfTouch.x < self.leftArrowMax) ) {
        [scrollView setContentOffset:CGPointMake(lastOffset - self.lengthOfLabel, 0) animated:YES];
    }
}
  

问题n.2是 - 如何使滚动视图四处转动 - 永无止境?

如果您知道计算scrollView元素序列中的下一个/上一个或随机元素的算法,则可以解决此问题。 基本上,我在我的一个项目中解决了同样的问题(appStore中的免费应用程序“IJCAI11”,你可以在任何选定的会议日的细节中看到datePicker的工作:应用了无限的算法滚动视图,我后来仅从设计的角度来应用的限制)。 我在那里使用的方案很简单,虽然可能有点奇怪(在阅读之前,请注意,在我的情况下,当scrollView处于非滚动状态时,我在屏幕上只看到scrollView的一个元素):

  1. 我用3创建UIScrollView(如果你一次看到多于1个元素,根据你的情况,这可能是5,7,...,2N + 1)标签;
  2. 激活第二个(中央)标签。
  3. 为所有3(2N + 1)个标签指定适当的值。在此步骤中,您的第二个(中央)标签将包含(将显示)默认值的数据。
  4. 当用户向左/向右滚动一步(到位置M_pos)时,您将以标准方式执行此操作,因为您的相邻中央标签包含正确的数据(M)。
  5. 然后你拿这个新的活动值(M)并将它应用于你的中心标签(这将在幕后,因此用户不会在屏幕上看到这一点),然后你正确地重新计算所有其他标签(。 ..,M-1,M,M + 1,...),包括你的M_pos位置(!)。
  6. 使用“动画:否”模式,您可以将scrollView移动到中心位置。在这种情况下,用户看不到任何东西,实际上他的scrollView从位置M_pos移动到中心位置。所有相邻的标签都已经重新计算,你可以随意重复第4点,给用户带来强烈的感觉,他使用带有大量元素的scrollView(而实际上你只需3个工作) (2N + 1)个标签,在每次移动后改变其内容。)
  7.   

    一个问题 - 是否可以制作一些“选择指标”?

    如果我正确理解了这个问题,那么只需考虑View / Subview的东西,特别是View类的函数addSubview;)

    希望这有帮助!

答案 1 :(得分:0)

我不确定我是否理解你的问题,但你是否已经考虑使用NSTimer以一定的速度或在一段时间内重复事件? (指着你的“圆圆的东西”。)