【问题标题】:IOS7 UIPickerView how to hide the selection indicatorIOS7 UIPickerView如何隐藏选择指示器
【发布时间】:2013-12-16 13:35:08
【问题描述】:

如何隐藏所选行上的这两行?

【问题讨论】:

  • 线条是设计使然。如果你能删除它们,我会感到非常惊讶。

标签: ios uiview ios7 uipickerview


【解决方案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) -&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 年
                猜你喜欢
                • 1970-01-01
                • 2013-09-25
                • 1970-01-01
                • 1970-01-01
                • 2012-12-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多