如图:红色框中是个自定义的导航工具条titlesView(没有绑定Tag),工具条中有五个按钮(按钮绑定了Tag)以及一个红色的指示器indicatorView(没有绑定Tag),下面的蓝色是可以滚动的scrollView,拖动scrollView,红色指示器会滚到对应按钮的下面,并且按钮呈红色显示.
在scrollView的代理方法scrollViewDidEndDecelerating:中通过
- 获得按钮首先注意的一点是,当指定的Tag为0时,会默认首先拿到的是调用这个方法的控件,也就是父控件titlesView,导致报错
- 其次注意的是,除了按钮还有别的干扰控件(这里只指示器indicatorView),干扰控件添加到父控件的时间比按钮添加到父控件的时间早,并且没有绑定Tag,通过viewWithTag:方法也会首先拿到干扰控件,导致报错.
解决方案:
- 方案一:将父控件以及干扰控件都绑定Tag,例如-1 -2 等
- 方案二:不适合于父控件,也就是说父控件必须绑定个Tag.其余干扰控件可以在按钮都addView到父控件后,干扰控件再add到父控件.(不建议用这种,当代码篇幅很长的时候,最后突然来了句addView:有时候真的很费解!)
1 - (void)setupTitlesView 2 { 3 CGFloat width = self.view.width; 4 CGFloat height = 35; 5 UIView *titlesView = [[UIView alloc] init]; 6 titlesView.frame = CGRectMake(0, 64, width, height); 7 titlesView.backgroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.6]; 8 titlesView.tag = -1; // scroll滚动完后要通过按钮绑定的tag,得到按钮并设置按钮属性,如果父控件中子控件不止有按钮,别的view的tag不绑定默认也是0,当通过tag==0找按钮的时候,就会报错.所以这里的解决办法是讲其余view绑定别的tag 9 [self.view addSubview:titlesView]; 10 self.titlesView = titlesView; 11 12 // 添加指示器 13 UIView *indicatorView = [[UIView alloc] init]; 14 indicatorView.backgroundColor = [UIColor redColor]; 15 indicatorView.height = 2; 16 indicatorView.y = titlesView.height - indicatorView.height; 17 indicatorView.tag = -2; // 理由同上,不设置也可以,但是要保证这些view的添加要添加到按钮的后面 18 [titlesView addSubview:indicatorView]; 19 self.indicatorView = indicatorView; 20 21 NSArray *items = @[@"全部",@"视频",@"音频",@"图片",@"段子"]; 22 23 CGFloat btnW = titlesView.width / items.count; 24 CGFloat btnH = titlesView.height; 25 CGFloat btnX = 0; 26 CGFloat btnY = 0; 27 // 循环添加按钮 28 for (int i = 0; i < items.count; i++) { 29 UIButton *btn = [[UIButton alloc] init]; 30 btnX = btnW * i; 31 btn.frame = CGRectMake(btnX, btnY, btnW, btnH); 32 [btn setTitleColor:[UIColor grayColor] forState:UIControlStateNormal]; 33 [btn setTitleColor:[UIColor redColor] forState:UIControlStateDisabled]; 34 [btn setTitle:items[i] forState:UIControlStateNormal]; 35 btn.titleLabel.font = [UIFont systemFontOfSize:14]; 36 btn.tag = i; // 给按钮添加绑定tag 37 [btn addTarget:self action:@selector(titleClick:) forControlEvents:UIControlEventTouchUpInside]; 38 [titlesView addSubview:btn]; 39 40 [btn layoutIfNeeded]; 41 42 if (i == 0) { 43 self.selectedButton = btn; 44 btn.enabled = NO; 45 // 以后设置尺寸,先设置尺寸,再设置点 46 self.indicatorView.width = btn.titleLabel.width; 47 self.indicatorView.centerX = btn.centerX; 48 } 49 } 50 }
时间: 2024-10-27 10:06:08