С новым плагином Android Gradle 3.x вам больше не нужно указывать версию для инструментов сборки (теперь вы можете удалить свойство android.buildToolsVersion
).
По умолчанию плагин автоматически использует минимально требуемую версию инструментов сборки для версии плагина Android , которую вы используете.
Вы можете прочитать больше здесь .
Вам необходимо убедиться, что ваше настраиваемое представление имеет следующие свойства:
pickerView : rowHeightForComponent:
и pickerView: widthForComponent:
. Если вы не указываете нестандартную высоту, высота по умолчанию - 44. [UIColor clearColor]
. Один попался при использовании экземпляров UILabel
в качестве настраиваемого представления UILabel
по умолчанию userInteractionEnabled
имеет значение NO
( UIView
, на с другой стороны, по умолчанию для этого свойства используется значение ДА
).
Исходя из этих требований, пример кода из Halle можно переписать следующим образом. В этом примере также правильно повторно используются ранее созданные представления, что необходимо для быстрой прокрутки.
- (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;
}
Я думаю, вы можете захотеть посмотрите на свойство "showsSelectionIndicator" UIPickerView
Я не уверен, есть ли простой способ удалить обратную связь при выборе, но вы можете скрыть ее, если сделаете фон метки белым и зададите ему те же размеры, что и синий прямоугольник выделения:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
UILabel *pickerRowLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 316, 40)];
pickerRowLabel.backgroundColor = [UIColor whiteColor];
pickerRowLabel.text = [pickerDataArray objectAtIndex:row];
[self.view addSubview:pickerRowLabel];
return pickerRowLabel;
}
С шириной 316 метка покрывает все, кроме полоски синего цвета с каждой стороны, а на 320 она полностью закрывает обратную связь выбора, но также начинает покрывать небольшую часть градиентов внешнего колеса, которые могут вас беспокоить, а могут и не беспокоить.
Установка свойства userInteractionEnabled
для UILabel
на YES
устраняет проблему с выделением, но также отключает UIPickerView
из автопрокрутки для выбора строки, к которой прикоснулись.
Если вы хотите отключить режим выделения, но сохранить функцию автоматической прокрутки UIPickerView
по умолчанию, вызовите функцию setShowSelection
в экземплярах UITableCell
, содержащихся в UIPickerView
. Один из способов сделать это - создать подкласс класса UILabel
, подобный следующему:
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
Затем, если вы ранее возвращали экземпляр UILabel
в pickerView: viewForRow: forComponent: reusingView:
, вернуть экземпляр PickerViewLabel
. Например, используя код из Дуга , вы должны заменить все регистры « UILabel
» на « PickerViewLabel
». Просто не забудьте удалить строку pickerRowLabel.userInteractionEnabled = YES;
.