I have a custom UIPickerView
where I use:
-(UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)view
to populate the picker with UILabels
. Is there a way to disable the behavior of highlighting the selected row when touched?
I think this is a property of the underlying UITableViewCell
inherent in the UIPickerView
and I can't find a way to change it.
You need to make sure your custom view has the following properties:
pickerView:rowHeightForComponent:
and pickerView:widthForComponent:
. The default height is 44 if you're not specifying a custom height.[UIColor clearColor]
.The one gotcha when using UILabel
instances as the custom view is that UILabel
defaults userInteractionEnabled
to NO
(UIView
, on the other hand, defaults this property to YES
).
Based on these requirements, the example code from Halle can be rewritten as follows. This example also correctly reuses previously created views, which is needed for fast scrolling performance.
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component
reusingView:(UIView *)view {
UILabel *pickerRowLabel = (UILabel *)view;
if (pickerRowLabel == nil) {
// Rule 1: width and height match what the picker view expects.
// Change as needed.
CGRect frame = CGRectMake(0.0, 0.0, 320, 44);
pickerRowLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
// Rule 2: background color is clear. The view is positioned over
// the UIPickerView chrome.
pickerRowLabel.backgroundColor = [UIColor clearColor];
// Rule 3: view must capture all touches otherwise the cell will highlight,
// because the picker view uses a UITableView in its implementation.
pickerRowLabel.userInteractionEnabled = YES;
}
pickerRowLabel.text = [pickerDataArray objectAtIndex:row];
return pickerRowLabel;
}
Setting the userInteractionEnabled
property of UILabel
to YES
fixes the highlighting issue, but it also disables the UIPickerView
from autoscrolling to select the row that has been touched.
If you want to disable the highlighting behavior, but maintain the UIPickerView
's default autoscrolling functionality, call the setShowSelection
function in the UITableCell
instances contained in the UIPickerView
. A way of doing this is to subclass the UILabel
class similar to the following:
PickerViewLabel.h -
#import <UIKit/UIKit.h>
@interface PickerViewLabel:UILabel
{
}
@end
PickerViewLabel.m -
#import "PickerViewLabel.h"
@implementation PickerViewLabel
- (void)didMoveToSuperview
{
if ([[self superview] respondsToSelector:@selector(setShowSelection:)])
{
[[self superview] performSelector:@selector(setShowSelection:) withObject:NO];
}
}
@end
Then, where you had previously been returning an instance of UILabel
in pickerView:viewForRow:forComponent:reusingView:
, return an instance of PickerViewLabel
. As an example, using the code from Doug, you would replace all the cases of 'UILabel
' with 'PickerViewLabel
'. Just remember to remove the pickerRowLabel.userInteractionEnabled = YES;
line.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With