IOS7 UIPickerView如何隐藏选择指示器
Posted
技术标签:
【中文标题】IOS7 UIPickerView如何隐藏选择指示器【英文标题】:IOS7 UIPickerView how to hide the selection indicator 【发布时间】:2013-12-16 13:35:08 【问题描述】:如何隐藏所选行上的这两行?
【问题讨论】:
线条是设计使然。如果你能删除它们,我会感到非常惊讶。 【参考方案1】:[[pickerview.subviews objectAtIndex:1] setHidden:TRUE];
[[pickerview.subviews objectAtIndex:2] setHidden:TRUE];
在pickerView
的titleForRow
或viewForRow
委托方法中使用它。
【讨论】:
【参考方案2】:根据其他答案,我决定枚举子视图并看到行的高度为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 提供的案例
【讨论】:
顺便说一句,如果你在一个高度为 0.5 的 UIPickerView 添加了一些子视图,你可以使用.tag
这个子视图来识别它并防止隐藏
在 iPhone 7 + 上,行高是 2/3 (0.666666666666667) 而不是 0.5,所以我最终检查了高度是否小于 1。func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int pickerView.subviews.forEach( $0.hidden = $0.frame.height <= 1 ) return myRowCount
【参考方案3】:
根据文档 (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];
这不是一个真正好的解决方案,而且绝对不能向前兼容,但现在它可以完成工作。希望这会有所帮助。
【讨论】:
顺便说一句。当你移除这些线条时,看起来有点奇怪,因为滚动的 3d 效果会改变视图的位置。我在玩,你也可以像这样改变这些线条的颜色:((UIView *)[self.subviews objectAtIndex:1]).backgroundColor = [UIColor whiteColor]; ((UIView *)[self.subviews objectAtIndex:2]).backgroundColor = [UIColor whiteColor];
感谢您的回答,但它引发了 NSRangeException -> -[__NSArrayI objectAtIndex:]: index 1 beyond bounds for empty array'
我添加了 2 个视图来隐藏这些线条,但它非常难看,暂时别无选择
我刚刚重新检查过。我实际上将 UIPickerview 子类化并在 initWithFrame 方法中添加了这些行(因此引用了 self.subviews)。也许在您添加 setHidden 行时,pickerview 尚未在您的代码中初始化?
@James03 更改选择器线的颜色有效。如果你不继承 UIPickerView,你应该从 -viewDidLayoutSubviews 调用代码,它不会从 -viewDidLoad 工作【参考方案4】:
这在 iOS 9 Beta 中的 Swift 中对我有用。
datePicker.subviews[0].subviews[1].hidden = true
datePicker.subviews[0].subviews[2].hidden = true
【讨论】:
【参考方案5】:Swift 3 版本(工作中):
pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true
【讨论】:
为我工作,把它放在 viewDidLoad 函数中。谢谢!【参考方案6】:func numberOfComponents(in pickerView: UIPickerView) -> Int
pickerView.subviews.forEach(
$0.isHidden = $0.frame.height < 1.0
)
return 1
【讨论】:
【参考方案7】:在 ios7 之前可以使用。
pickerView.showsSelectionIndicator = NO;
有关 ios7 的更多信息,请参阅此文档
https://developer.apple.com/library/ios/documentation/userexperience/conceptual/UIKitUICatalog/UIPickerView.html
【讨论】:
是的已经试过了,在ios7上苹果的文档说不能隐藏,我正在寻找一个技巧,有没有隐藏指标的正确方法? 目前没有技术方法。如果你想,那么你就按照你的逻辑去做吧。 @James03 ,我相信找到了删除线条的方法,请参阅我的答案。【参考方案8】:这很容易实现。只需将 PickerView 放在具有所需行大小的 ScrollView 中,然后使用 picker delegate(pickerView:rowHeightForComponent:) 方法将选取器的行高更改为比 ScrollView 大一点。像这样,线条将被隐藏。
【讨论】:
我喜欢这种方法。用户很容易看到要做什么,而不会占用太多屏幕空间..【参考方案9】:斯威夫特 4.2
将这两行代码粘贴到您的 titleForRow 或 pickerView 的 viewForRow 委托方法中。
pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true
你应该很高兴。
【讨论】:
【参考方案10】:我通过一个简单的技巧解决了这个问题: 将选取器视图放置在视图中,并设置此视图的剪辑子视图属性 = true。 现在,只需在选择器视图中设置行高 = 容器视图的高度,然后该行就会消失。
【讨论】:
【参考方案11】:斯威夫特 5
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
pickerView.subviews[1].isHidden = true
pickerView.subviews[2].isHidden = true
return pickerData[row]
【讨论】:
【参考方案12】:我选择了一种不同的方法来让它更具未来性,以防万一苹果决定改变某些东西
for subview in setPickerView.subviews
if subview.frame.origin.y != 0
subview.isHidden = true
由于(包含项目的子视图)的原点 y 位置为 0,所以我可以安全地隐藏其他任何内容,而不会冒索引超出范围错误的风险
享受
编辑:我忘了告诉你我把它放在 viewDidLayoutSubviews 方法中!
【讨论】:
这也适用于 - func numberOfComponents(in pickerView: UIPickerView) -> Int 【参考方案13】:只需在您的 viewdidload 方法中编写此代码
[[PickerView.subviews objectAtIndex:1] setHidden:TRUE];
[[PickerView.subviews objectAtIndex:2] setHidden:TRUE];
【讨论】:
我感觉这只在你的 viewDidLoad 中有效,因为 pickerView 是完全定义的。我不得不使用上面 ChrisH 的答案让 Swift 隐藏这些线条。我不确定为什么 Apple 有一个设置而他们忽略了它。 是的,如果您使用界面生成器,那么您将获得pickerview。否则你必须在以编程方式创建选择器后设置它【参考方案14】:在 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];
好的,这样会好很多:] 如果有人有更好的答案,就把它写下来分享:)
【讨论】:
【参考方案15】:此代码适用于 带有 swift 3 的 iOS 10
只需将此代码添加到您的视图控制器类中。
override func viewDidLayoutSubviews()
timePickerView.subviews[1].isHidden = true
timePickerView.subviews[2].isHidden = true
【讨论】:
不应硬编码索引偏移量。可能崩溃是 iOS 更改。【参考方案16】:您还可以对 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 年以上是关于IOS7 UIPickerView如何隐藏选择指示器的主要内容,如果未能解决你的问题,请参考以下文章