如何更改 UIPickerView 中选定行的颜色
好吧,也许我错过了一些非常简单的东西,如果是这样的话,我很抱歉,但是,我已经用谷歌搜索了标题的每个排列,但没有找到!所以这就是我想要做的:当选择该行时,更改我用作 2 组件选取器视图中的行视图的标签的背景颜色。所以我认为这会起作用:
if (row == [pickerview selectedRowForComponent])
viewlabel.backgroundColor = redcolor;
但这行不通。它似乎任意选择对哪一行进行着色,有时甚至会给出错误的访问错误。我已经尝试了所有不同的条款,但没有效果!任何建议将不胜感激!
这是完整的方法:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
if (component == kNumberComponent) {
#define PICKER_LABEL_FONT_SIZE 24
#define PICKER_LABEL_ALPHA 1.0
// UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:24];
UILabel *carsLabel =[ [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 50) ]autorelease];
//[picker selectRow:row inComponent:component animated:YES];
NSString *pickerText = [self.numbers objectAtIndex:(int)row];
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
} else {
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:18];
UILabel *carsLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 225, 50)] autorelease];
id fact = [self.facts objectAtIndex:(int)row];
NSString *pickerText = @"Dictionary Entry";
if ( [fact isKindOfClass:[NSString class]]) {
pickerText = [self.facts objectAtIndex:(int)row];
}
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
if ( row == 0) {
carsLabel.backgroundColor = [UIColor redColor];
}
//carsLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackboard.png"]];;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
}
return nil;
}
Ok, maybe I'm missing something really simple and I apologize if that's the case, however, I've googled every permutation of the title and have not found! So this is simply what I want to do: change the background color of the label I'm using as the row view in a 2 component pickerview when that row has been selected. So I thought this would work:
if (row == [pickerview selectedRowForComponent])
viewlabel.backgroundColor = redcolor;
but this doesn't work. It seems to arbitrarily choose which row to color and sometimes even give a bad access error. I've tried all different clauses to no effect! ANy suggestions would be greatly appreciated!!
Here's the full method:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
if (component == kNumberComponent) {
#define PICKER_LABEL_FONT_SIZE 24
#define PICKER_LABEL_ALPHA 1.0
// UIFont *font = [UIFont boldSystemFontOfSize:PICKER_LABEL_FONT_SIZE];
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:24];
UILabel *carsLabel =[ [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 75, 50) ]autorelease];
//[picker selectRow:row inComponent:component animated:YES];
NSString *pickerText = [self.numbers objectAtIndex:(int)row];
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
} else {
UIFont *font = [ UIFont fontWithName:@"AppleGothic" size:18];
UILabel *carsLabel = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 225, 50)] autorelease];
id fact = [self.facts objectAtIndex:(int)row];
NSString *pickerText = @"Dictionary Entry";
if ( [fact isKindOfClass:[NSString class]]) {
pickerText = [self.facts objectAtIndex:(int)row];
}
carsLabel.text = pickerText;
carsLabel.textAlignment = UITextAlignmentCenter;
NSLog(@"carsLabel = %@",carsLabel.text);
//carsLabel.text = @"maybe because the string isn't long enough";
carsLabel.textColor = [UIColor blackColor];
carsLabel.font = font;
if ( row == 0) {
carsLabel.backgroundColor = [UIColor redColor];
}
//carsLabel.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"blackboard.png"]];;
carsLabel.opaque = YES;
[view addSubview:carsLabel];
return carsLabel;
}
return nil;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
通常,我使用这种方法:
我使用自定义视图来显示行项目,
我更改所选行的颜色:
Normally, I use this method:
I use the custom view for show the row item
I change color of row selected with:
迅速实施
Swift implementation
viewForPicker 的正确格式是:
上面代码的问题是:它为标签着色,而不是选择器本身。因此,当您滚动到一端或另一端时,会出现一个空白点,您可以在其中看到白色背景。设置 [myPicker setBackgroundColor...] 并不能达到人们所希望的效果。
The correct format for viewForPicker is:
The problem with the code above is: it colorizes the labels, but not the picker, itself. So, when you roll to one end or the other, there's a blank spot where you can see the white background. Setting [myPicker setBackgroundColor...] doesn't do what one might hope.
解决了!声明 2 个实例变量:selectedView 和 oldView。然后下面的代码就可以解决问题:
Solved! Declare 2 instance variables: selectedView, and oldView. Then the following code does the trick:
@alessandro-pirovano 答案的 Swift 版本
Swift version of @alessandro-pirovano answer
// CGRect为我们想要的框架创建值
// 定义我们想要使用的图像
// 将 x 和 y 值设置为 UIPickerView 上要放置图像的点
// 设置宽度和高度图像的宽度和高度的值
// 将自定义选择指示器也添加到同一个视图控制器
// CGRectMake values for the frame we’d like
// define the image that we would like to use
// set the x and y values to the point on the UIPickerView where you want to place the image
// set the width and height values to the width and height of your image
// add the custom selectionIndicator also to the same viewcontroller
调用
UIPickerView
实例的-viewForRow:forComponent:
方法来获取UIView *
对象。然后设置该视图的背景UIColor
。Call the
UIPickerView
instance's-viewForRow:forComponent:
method to get theUIView *
object. Then set that view's backgroundUIColor
.目前尚不清楚您将上述代码放在哪里。是在
-pickerView:viewForRow:forComponent:reusingView:
中吗?这是它应该在的地方。您确定正在维护指向该特定视图的标签的指针吗?您崩溃的事实表明您可能没有崩溃。更大的代码块(包括您放置它的位置)会很有帮助。It's unclear where you are putting the above code. Is it in
-pickerView:viewForRow:forComponent:reusingView:
? This is where it should be. Are you sure that you are maintaining a pointer to the label for that particular view? The fact that you are crashing suggests you probably are not. A larger block of code, including where you have put it, would be helpful.这对我有用:
UIView
作为子视图添加到您的UIPickerView
中,UIPickerView
输入 Y,并且具有相同的内容widthpickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> > 返回的高度CGFloat
*其余解决方案(使用行的自定义视图或行的属性字符串)在快速滚动时会出现错误。
Here's what worked for me:
UIView
as a subview to yourUIPickerView
UIPickerView
and the has the same widthpickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
*the rest of the solutions (with custom views for row or attributed stringsfor row) were buggy when scrolling fast.
UIPickerView 有委托为行和组件的标题设置 NSAttributeString 我们可以设置属性颜色,如下所示:
}
UIPickerView has delegate to set NSAttributeString for title at row and component we can set attribute color like below:
}
扩展 Alessandro Pirovano 的答案;
Expanding on Alessandro Pirovano's answer;