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];

pickerViewtitleForRowviewForRow 委托方法中使用它。

【讨论】:

【参考方案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) -&gt; Int pickerView.subviews.forEach( $0.hidden = $0.frame.height &lt;= 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如何隐藏选择指示器的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView 选择行不起作用 ios7

UIPickerView - 无法在 ios7 中点击要选择的项目

UIPickerView 选择和隐藏

当用户触摸已选择的行时如何隐藏 UIPIckerView

UIPickerView 选择指示器问题

调整 UIPickerView 中选择指示器的高度