【问题标题】:Hide individual keyboard buttons in iOS [closed]在iOS中隐藏单个键盘按钮[关闭]
【发布时间】:2014-07-20 11:33:16
【问题描述】:

目前我正在尝试制作一个 Hangman 应用。我已经完成了主要功能,但我想要一种方法来显示用户已经猜到了哪些字母。我想通过从键盘隐藏这些字母(这是由文本字段激活的标准键盘)来做到这一点。我已经阅读了关于在键盘上添加按钮(例如本教程:http://www.neoos.ch/blog/37-uikeyboardtypenumberpad-and-the-missing-return-key)但不删除/禁用现有按钮。 有人知道解决方案吗?我好像搞不懂。

谢谢

【问题讨论】:

  • 没有 API 可以做到这一点。您必须创建自己的自定义键盘(祝您好运支持所有国际键盘)。
  • 引用的文章大约有5年的历史了,只是有点过时了……但是您可以随时实现自己的键盘。
  • 根据 rmaddy 的评论,唯一的方法是使用 remus 评论中的答案创建自己的键盘。

标签: ios objective-c


【解决方案1】:

没有公共 API 可以做到这一点。因此,正如 cmets 中已经建议的那样:您最好将自己的键盘实现为 UIView 子类,并使用方法以您需要的方式更改其行为(隐藏按钮、添加新按钮等)。有很多教程会教你如何做到这一点。苹果还建议这样做here。如果您计划国际化您的应用程序,您还应该在自己的键盘类中处理所有本地化支持。所以所有这些东西都很难实现。如果您不想这样做,那么唯一的方法是使用一些脏视图操作并将键盘作为UIView 对象访问,然后随心所欲地使用它。 但是这是一个非常糟糕的方法,因为它使用私有视图层次结构,并且当 Apple 对其进行一些更改时可能会被破坏,就像它在 iOS 7 中使用 UITableViewCell 视图层次结构一样。而且它也是一种非常有限的方式。首先你必须确保键盘已经显示给用户,否则你会崩溃(因为windows数组将只包含一个UIWindow)。为此,只需添加一个通知观察者:

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardShowed)
  name:UIKeyboardDidShowNotification object:nil];

然后在keyboardShowed方法中(iOS版本在[4.0,7.1]区间有效)

-(void)keyboardShowed
 {
UIWindow* window = [[[UIApplication sharedApplication] windows]
                    objectAtIndex:1];
for(UIView* view in window.subviews)
{
    if([[view description] hasPrefix:@"<UIPeripheralHostView"])
    {
        //This view is a keyboard view
        // you can iterate its subviews
        //and make buttons hidden
        NSLog(@"Keyboard Shown: %@", view);
    }
  }
}

然后,当您实际获得对键盘视图的引用时,您应该使用subviews 属性沿着所有层次结构(UIKeyboardImplUIKeyboardLayoutStar 等)跟踪它,而您实际上将获得像按钮这样的视图。

但正如我所说,这是一个不好的方法。因为私有视图层次结构很大,有很多子视图。因此,您应该以其他方式处理您的功能。为什么不允许用户输入他已经在你的游戏中猜到的字母,并向他显示某种警告信息?

【讨论】:

  • 感谢您的快速回复,我尝试以这种方式遍历它的子视图,但找不到对单个按钮的引用。我知道这是一种不好的方式,但我正在为我目前正在学习的课程制作应用程序,并且我不打算实际发布它,所以我并没有真正关注未来,但感谢您的建议!关于子视图的任何想法以及如何隐藏例如键盘上的字母 A?谢谢!
  • @JaapWijnen 你看到我的编辑了吗?我更新了答案。可能这会有所帮助
  • 谢谢!我确实在您的编辑中发现了一些有趣的东西。剩下一个问题,当我找到正确的子视图时,如何删除或禁用某个子视图?
  • @JaapWijnen 有几种方法。正如我所说,这是一个肮脏的黑客,所以它需要大量的研究工作。您应该在这些子视图中查找 uibuttons 子类,如果找到它们,只需将 userInteractionEnabled 设置为 NO。但我强烈怀疑键盘按钮不是通常的按钮。它可能只是自定义 UIView 或图像视图。如果是这样,将hidden 属性设置为YES 的唯一可能方式。这将完全隐藏视图。你应该试验一下。但正如我在原始答案中所说,还有其他更正确的方法来实现此功能
  • 我设法找到以下内容:键盘包含两个子视图 UIKBInputBackdropView 和 UIKeyboardAutomatic UIKInputBackdropView contains: UIKBBackdropView contains: _UIBackdropEffectView UIView 4x UIKeyboardAutomatic contains: UIkeyboardImpl contains: UIKeyboardLayoutStar contains: UIKBBackgroundView contains: UIImageView UIKBKeyplaneView contains: UIKBSplitImageView contains: UIKBSplitImageView contains: ImageView UIKBSplitImageView contains: ImageView UIKBKeyView 5x UIKBDimmingView
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 2017-01-31
  • 2011-07-30
  • 2012-11-15
  • 2017-05-23
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多