IOS7 UIPickerView如何隐藏select指示器
我怎么能隐藏选定的行上的这2行?
[[pickerview.subviews objectAtIndex:1] setHidden:TRUE]; [[pickerview.subviews objectAtIndex:2] setHidden:TRUE];
在titleForRow
或viewForRow
委托方法中使用pickerView
。
基于其他答案,我决定枚举子视图,看到这些行的高度为0.5
所以现在我的解决scheme在Swift中看起来像这样:
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { pickerView.subviews.forEach({ $0.hidden = $0.frame.height < 1.0 }) return myRowCount }
在Objective-C中
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { [pickerView.subviews enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) { subview.hidden = (CGRectGetHeight(subview.frame) < 1.0) }]; return myRowCount }
显然不是特别有前途的证据,但可能比在给定索引处隐藏子视图更为重要。
编辑:更新来处理@Loris提供的情况
在iOS7中,根据文档( https://developer.apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UIPickerView.html )设置参数pickerview.showsSelectionIndicator不起作用。
然而,作为一个UIPickerView到底是一个UIView与子视图,我检查了哪些子视图。 我发现3,第一个包含UIPickerView的所有组件,另外两个是两行。
所以通过设置第二个和第三个(索引1和2)隐藏,两条线被删除。
[[pickerview.subviews objectAtIndex:1] setHidden:TRUE]; [[pickerview.subviews objectAtIndex:2] setHidden:TRUE];
这不是一个很好的解决scheme,而且绝对不是兼容的,但是现在它完成了工作。 希望这可以帮助。
这在Swift中适用于iOS 9 Beta。
datePicker.subviews[0].subviews[1].hidden = true datePicker.subviews[0].subviews[2].hidden = true
Swift 3版本(工作):
pickerView.subviews[1].isHidden = true pickerView.subviews[2].isHidden = true
它在ios7之前工作。
pickerView.showsSelectionIndicator = NO;
有关ios7的更多信息,请参阅此文档
这很容易实现。 只需将你的PickerView放在一个ScrollView里面,并且使用picker delegate(pickerView:rowHeightForComponent :)方法把select器的行高改成比你的ScrollView大一点。 像那样,这些线将被隐藏。
我通过一个简单的技巧解决了这个问题:在视图中放置select器视图,并设置此视图的剪辑子视图属性= true。 现在,只需在select器视图中设置行的高度=容器视图的高度,那么该行将消失。
func numberOfComponents(in pickerView: UIPickerView) -> Int { pickerView.subviews.forEach({ $0.isHidden = $0.frame.height < 1.0 }) return 1 }
只需在你的viewdidload方法中写下这段代码
[[PickerView.subviews objectAtIndex:1] setHidden:TRUE]; [[PickerView.subviews objectAtIndex:2] setHidden:TRUE];
在ios7中,我们不能隐藏UIPickerView中的单独行,我们可以从这个页面知道: https : //developer.apple.com/library/ios/documentation/UIKit/Reference/UIPickerView_Class/index.html#//apple_ref / OCC / instm / UIPickerView / showsSelectionIndicator
但是我们可以添加两个UIViews来覆盖它,两个UIViews的宽度是1.一些示例代码在这里:
s_leftLine = [[UIView alloc] initWithFrame:CGRectMake(s_pickerView.frame.size.height/2, s_pickerView.frame.size.width/2 - kWidthOfPickerPage/2 + 1, 1, s_pickerView.frame.size.height)]; s_leftLine.backgroundColor = [UIColor whiteColor]; s_leftLine.layer.zPosition = s_pickerView.layer.zPosition + 1; // make sure the line is on the top [s_pickerView addSubview:s_leftLine];
好吧,这会好得多:]如果有人有更好的答案只是把它写下来共享:)
我select了一种不同的方法,以防止苹果决定改变一些事情
for subview in setPickerView.subviews{ if subview.frame.origin.y != 0{ subview.isHidden = true } }
由于(包含项目的子视图)的起源y位置是0,那么我可以安全地隐藏其他任何东西,而不会冒一个索引超出界限的错误
请享用
编辑:我忘了告诉你,我把它放在viewDidLayoutSubviews方法!
您也可以对UIPickerView进行扩展:
extension UIPickerView { func hideSelectionIndicator() { for i in [1, 2] { self.subviews[i].isHidden = true } } }
然后调用myPickerView.hideSelectionIndicator()
为每个你想改变的PickerView。
此代码适用于iOS 10,使用swift 3
只要在你的视图控制器类中添加这个代码。
override func viewDidLayoutSubviews() { timePickerView.subviews[1].isHidden = true timePickerView.subviews[2].isHidden = true }