[英]How to change color of selected row in UIPickerView
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.
所以这就是我想要做的:在选择该行时,更改我用作 2 组件选择器视图中的行视图的标签的背景颜色。 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;
}
Normally, I use this method:通常,我使用这种方法:
I use the custom view for show the row item我使用自定义视图来显示行项目
-(UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *label = (id)view;
if (!label)
{
label= [[UILabel alloc] initWithFrame:CGRectMake(0.0f, 0.0f, [pickerView rowSizeForComponent:component].width, [pickerView rowSizeForComponent:component].height)];
label.textAlignment = NSTextAlignmentCenter;
label.textColor = [UIColor whiteColor];
label.text = _arrayStringPicker[row];
}
return label;
I change color of row selected with:我更改所选行的颜色:
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
UILabel *labelSelected = (UILabel*)[pickerView viewForRow:row forComponent:component];
[labelSelected setTextColor:[UIColor redColor]];
}
The correct format for viewForPicker is: viewForPicker 的正确格式是:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *label = (UILabel*) view;
if (label == nil)
{
label = [[UILabel alloc] init];
}
[label setText:@"Whatever"];
// This part just colorizes everything, since you asked about that.
[label setTextColor:[UIColor whiteColor]];
[label setBackgroundColor:[UIColor blackColor]];
CGSize rowSize = [pickerView rowSizeForComponent:component];
CGRect labelRect = CGRectMake (0, 0, rowSize.width, rowSize.height);
[label setFrame:labelRect];
return label;
}
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.
设置 [myPicker setBackgroundColor...] 不符合人们的期望。
Swift implementation Swift 实现
extension PickerViewController: UIPickerViewDelegate {
func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
var color: UIColor!
if pickerView.selectedRowInComponent(component) == row {
color = UIColor.redColor()
} else {
color = UIColor.blackColor()
}
let attributes: [String: AnyObject] = [
NSForegroundColorAttributeName: color,
NSFontAttributeName: UIFont.systemFontOfSize(15)
]
return NSAttributedString(string: rows[row], attributes: attributes)
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
//this will trigger attributedTitleForRow-method to be called
pickerView.reloadAllComponents()
}
}
// CGRectMake values for the frame we'd like // CGRectMake 我们想要的帧的值
UIPickerView *myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0,0, self.view.bounds.size.width, self.view.bounds.size.height)];
// add the UIPickerView to your viewcontroller [mainView addSubview:myPickerView];
// set the selectionindicator to none myPickerView.showsSelectionIndicator = NO;
// define the image that we would like to use // 定义我们想要使用的图像
UIImage *selectorImage = [UIImage imageNamed:@"selectionIndicator.png"];
UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];
// set the x and y values to the point on the UIPickerView where you want to place the image // 将 x 和 y 值设置为 UIPickerView 上要放置图像的点
// set the width and height values to the width and height of your image // 将宽度和高度值设置为图像的宽度和高度
customSelector.frame = CGRectMake(10,(myPickerView.bounds.size.height / 2) + 16, self.view.bounds.size.width – 10, 47);
// add the custom selectionIndicator also to the same viewcontroller // 也将自定义 selectionIndicator 添加到同一个视图控制器
[mainView addSubview:customSelector];
Solved!解决了! Declare 2 instance variables: selectedView, and oldView.
声明 2 个实例变量:selectedView 和 oldView。 Then the following code does the trick:
然后下面的代码可以解决问题:
if (self.oldView != nil)
self.oldView.backgroundColor = [UIColor clearColor];
self.selectedView = [picker viewForRow:row forComponent:kNumberComponent];
self.selectedView.backgroundColor = [UIColor redColor];
[self.selectedView setNeedsDisplay];
self.oldView = self.selectedView;
Swift version of @alessandro-pirovano answer @alessandro-pirovano 答案的 Swift 版本
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
let rowSize = pickerView.rowSize(forComponent: component)
let width = rowSize.width
let height = rowSize.height
let frame = CGRect(x: 0, y: 0, width: width, height: height)
let label = UILabel(frame: frame)
label.textAlignment = .center
label.text = rows[row]
return label
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
guard let label = pickerView.view(forRow: row, forComponent: component) as? UILabel else {
return
}
label.backgroundColor = .orange
}
Call the UIPickerView
instance's -viewForRow:forComponent:
method to get the UIView *
object.调用
UIPickerView
实例的-viewForRow:forComponent:
方法来获取UIView *
对象。 Then set that view's background UIColor
.然后设置该视图的背景
UIColor
。
Here's what worked for me:以下是对我有用的内容:
UIView
as a subview to your UIPickerView
UIView
作为子视图添加到UIPickerView
UIPickerView
and the has the same widthUIPickerView
输入的 Y 并且具有相同的宽度pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat
pickerView(_ 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 has delegate to set NSAttributeString for title at row and component we can set attribute color like below: UIPickerView 有委托为行和组件的标题设置 NSAttributeString 我们可以设置属性颜色如下:
- (NSAttributedString *)pickerView:(UIPickerView *)pickerView attributedTitleForRow:(NSInteger)row forComponent:(NSInteger)component {
NSDictionary *attrs = @{NSForegroundColorAttributeName : [UIColor redColor]};
NSString *title = @"title"
return [[NSAttributedString alloc] initWithString:title attributes:attrs];
} }
Expanding on Alessandro Pirovano's answer;扩展 Alessandro Pirovano 的回答;
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
UILabel *labelSelected = (UILabel*)[pickerView viewForRow:row forComponent:component];
[labelSelected setTextColor:[UIColor redColor]];
labelSelected.superview.backgroundColor = [UIColor yellowColor];
}
It's unclear where you are putting the above code.目前还不清楚你把上面的代码放在哪里。 Is it in
-pickerView:viewForRow:forComponent:reusingView:
?是在
-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.
更大的代码块,包括您放置它的位置,会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.