iOS - 隐藏的配件在方向改变后变得可见

时间:2014-04-28 10:17:34

标签: ios7 uitextfield uiinterfaceorientation

在我的情况下,我使用UITextField作为附件,我不需要一直显示。我已确认在方向通知事件触发后发生了更改。我想一个黑客将把配件的大小调整为零高度,但我不愿意这样做。

想知道是否有人遇到过此问题并找到解决方案?

已输入错误报告并提供了示例项目。对于那些拥有更高权限的人,可以在bugreport.apple.com上搜索ID 16771757.我还将其复制到可以https://www.dropbox.com/s/o28vo04ig3yhgz6/ID16771757.zip访问的Dropbox帐户。

感谢您的阅读。

3 个答案:

答案 0 :(得分:5)

iOS为输入附件视图实例调用此类方法:

  1. [inputAccessoryView setAlpha:1];当附件视图的所有者成为第一响应者时(内部方法调用-[UIPeripheralHost(UIKitInternal) executeTransition:]);
  2. 界面轮换完成时
  3. [inputAccessoryView setHidden:NO];(内部方法调用-[UIPeripheralHost finishRotationOfKeyboard:]);
  4. 这就是为什么输入附件视图在界面旋转事件后变得可见。

    解决方案取决于您期望的行为:
    让我们想象一下input accessory view height = 44 - >
    现在您隐藏输入附件视图并将所有者设置为第一响应者:
    如果您期望inputAccessoryView.frame.size.height equals 0,则隐藏输入附件视图的解决方案将设置为nil:inputAccessoryView = nil;

    如果您期望inputAccessoryView.frame.size.height equals 44,则隐藏输入附件视图的解决方案将覆盖setHidden:方法:

    - (void)setHidden:(BOOL)hidden {
        [super setHidden:self.customIsHiddenFlag];
    }  
    

    您需要使用customIsHiddenFlag属性来实现显示/隐藏附件视图的逻辑;

    或覆盖setAlpha:方法:

    - (void)setAlpha:(CGFloat)alpha {
        [super setAlpha:(self.customIsHiddenFlag ? 0 : 1)];
    }
    

    这些解决方案适用于iOS 7.

    对于iOS 6,您可以使用基础解决方案inputAccessoryView.hidden = YES,因为iOS在触发界面轮换时不会自动调用setHidden:NO,因此它可以正常工作。

    似乎你是对的,它是iOS6和iOS7上不同行为的错误原因。如果Apple想要强制显示输入附件视图,那么他们不仅应在界面轮换后调用setHidden:NO,还应在所有者成为第一响应者时调用{{1}}。

答案 1 :(得分:2)

来自Apple关于inputAccessoryView的文档:

  

... 子类 ,希望将自定义控件附加到系统提供的输入视图(例如键盘)或自定义输入视图(您在inputView属性) 应将此属性重新声明为readwrite ,并使用它来管理自定义附件视图。 [强调我的]

因此隐藏附件视图的正确方法是将属性重新声明为readwrite:

@property (nonatomic, readwrite) UIView *inputAccessoryView;

从superview中删除附件视图,并在适当的时候将属性设置为nil:

- (IBAction)hideAccessoryView:(UIButton *)sender
{
    [self.inputAccessoryView removeFromSuperview];
    self.inputAccessoryView = nil;
}

这对于文档来说是正确的,但是如果你看一下视图层次结构,那么UIPeripheralHostView(UIKit私有类)不会改变它的大小。这很可能意味着丢弃配件视图不会反映键盘大小 - 它将保持不变。如果您计划计算任何偏移以适应屏幕键盘,请记住这一点。

也就是说,向前推进的最佳方式可能是使用完全透明的视图作为附件视图,并将自定义视图(在本例中为UITextField)作为子视图。这样,您就可以完全控制自定义视图以及应用程序在当前和未来iOS版本上的一致行为。

编辑:

这是一个屏幕截图,显示了您的错误报告应用程序的略微修改版本,突出显示了UIPeripheralHostView:

Reveal screenshot

在删除附件视图后,您可以看到视图的大小保持不变。

答案 2 :(得分:1)

当您添加附件视图时,您将通过"传递"它到系统进行布局。很可能,当Apple在键盘视图上执行布局时,它还会布局附件视图并将其设置为可见。将附件设置为隐藏也可能会产生其他副作用,例如键盘高度计算不正确,从而导致插入计算错误。

根据我的经验,最好取下配件并在必要时再次添加。调整附件视图的大小将导致与键盘大小相关的其他问题。如果要快速隐藏和显示,请为包含附件视图的视图创建子类,并在内部实现设置和删除附件视图。