【发布时间】:2013-12-16 13:35:08
【问题描述】:
如何隐藏所选行上的这两行?
【问题讨论】:
-
线条是设计使然。如果你能删除它们,我会感到非常惊讶。
标签: ios uiview ios7 uipickerview
如何隐藏所选行上的这两行?
【问题讨论】:
标签: ios uiview ios7 uipickerview
[[pickerview.subviews objectAtIndex:1] setHidden:TRUE];
[[pickerview.subviews objectAtIndex:2] setHidden:TRUE];
在pickerView 的titleForRow 或viewForRow 委托方法中使用它。
【讨论】:
根据其他答案,我决定枚举子视图并看到行的高度为0.5,所以我的解决方案现在在 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 提供的案例
【讨论】:
.tag 这个子视图来识别它并防止隐藏
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { pickerView.subviews.forEach({ $0.hidden = $0.frame.height <= 1 }) return myRowCount }
根据文档 (https://developer.apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UIPickerView.html),在 iOS7 中设置参数 pickerview.showsSelectionIndicator 无效。
但是,作为最后的 UIPickerView 是带有子视图的 UIView,我检查了有哪些子视图。找到了3个,第一个包含了UIPickerView的所有组件,另外两个就是这两行。
所以通过设置第二和第三(索引 1 和 2)隐藏,这两行被删除。
[[pickerview.subviews objectAtIndex:1] setHidden:TRUE];
[[pickerview.subviews objectAtIndex:2] setHidden:TRUE];
这不是一个真正好的解决方案,而且绝对不能向前兼容,但现在它可以完成工作。希望这会有所帮助。
【讨论】:
((UIView *)[self.subviews objectAtIndex:1]).backgroundColor = [UIColor whiteColor]; ((UIView *)[self.subviews objectAtIndex:2]).backgroundColor = [UIColor whiteColor];
这在 iOS 9 Beta 中的 Swift 中对我有用。
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
【讨论】:
func numberOfComponents(in pickerView: UIPickerView) -> Int
{
pickerView.subviews.forEach({
$0.isHidden = $0.frame.height < 1.0
})
return 1
}
【讨论】:
在 ios7 之前可以使用。
pickerView.showsSelectionIndicator = NO;
有关 ios7 的更多信息,请参阅此文档
【讨论】:
这很容易实现。只需将 PickerView 放在具有所需行大小的 ScrollView 中,然后使用 picker delegate(pickerView:rowHeightForComponent:) 方法将选取器的行高更改为比 ScrollView 大一点。像这样,线条将被隐藏。
【讨论】:
斯威夫特 4.2
将这两行代码粘贴到您的 titleForRow 或 pickerView 的 viewForRow 委托方法中。
pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true
你应该很高兴。
【讨论】:
我通过一个简单的技巧解决了这个问题: 将选取器视图放置在视图中,并设置此视图的剪辑子视图属性 = true。 现在,只需在选择器视图中设置行高 = 容器视图的高度,然后该行就会消失。
【讨论】:
我选择了一种不同的方法来让它更具未来性,以防万一苹果决定改变某些东西
for subview in setPickerView.subviews{
if subview.frame.origin.y != 0{
subview.isHidden = true
}
}
由于(包含项目的子视图)的原点 y 位置为 0,所以我可以安全地隐藏其他任何内容,而不会冒索引超出范围错误的风险
享受
编辑:我忘了告诉你我把它放在 viewDidLayoutSubviews 方法中!
【讨论】:
只需在您的 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
但是我们可以添加两个 UIView 来覆盖它,两个 UIView 的宽度为 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];
好的,这样会好很多:] 如果有人有更好的答案,就把它写下来分享:)
【讨论】:
此代码适用于 带有 swift 3 的 iOS 10
只需将此代码添加到您的视图控制器类中。
override func viewDidLayoutSubviews() {
timePickerView.subviews[1].isHidden = true
timePickerView.subviews[2].isHidden = true
}
【讨论】:
您还可以对 UIPickerView 进行扩展:
extension UIPickerView {
func hideSelectionIndicator() {
for i in [1, 2] {
self.subviews[i].isHidden = true
}
}
}
然后只需为您要更改的每个 PickerView 调用 myPickerView.hideSelectionIndicator()。
【讨论】:
Terminating app due to uncaught exception 'NSRangeException, reason: -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0] 2018 年