Ios7 iOS-方向更改后隐藏的附件变为可见

Ios7 iOS-方向更改后隐藏的附件变为可见,ios7,uitextfield,uiinterfaceorientation,Ios7,Uitextfield,Uiinterfaceorientation,在我的例子中,我使用UITextField作为附件,不需要一直显示。我已经确认了改变发生在定向通知事件发生后。我想一个黑客将调整配件的大小为零高度,但我不愿意这样做 想知道是否有人遇到过这种情况并找到了解决方案 已输入错误报告并提供了示例项目。对于拥有更高权限的用户,可以在bugreport.apple.com上搜索,ID为16771757。我还将其复制到了一个Dropbox帐户,该帐户可以作为 感谢阅读。添加附件视图时,您将其“传递”到系统以进行布局。更有可能的是,当苹果在键盘视图上进行布局时

在我的例子中,我使用
UITextField
作为附件,不需要一直显示。我已经确认了改变发生在定向通知事件发生后。我想一个黑客将调整配件的大小为零高度,但我不愿意这样做

想知道是否有人遇到过这种情况并找到了解决方案

已输入错误报告并提供了示例项目。对于拥有更高权限的用户,可以在bugreport.apple.com上搜索,ID为16771757。我还将其复制到了一个Dropbox帐户,该帐户可以作为


感谢阅读。

添加附件视图时,您将其“传递”到系统以进行布局。更有可能的是,当苹果在键盘视图上进行布局时,它也会布局附件视图并将其设置为可见。将附件设置为隐藏也会产生其他副作用,例如键盘高度计算不正确,从而导致插入计算不正确


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

iOS为输入附件视图实例调用以下方法:

  • [inputAccessoryView setAlpha:1]当附件视图的所有者成为第一响应者时(内部方法调用
    -[uiperipheraldhost(UIKitInternal)executeTransition:
  • [inputAccessoryView设置隐藏:否]当接口旋转完成时(内部方法调用
    -[UIPeripheralHost FinishRotationof Keyboard::
    这就是为什么您的输入附件视图在界面旋转事件后变得可见

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

    如果希望
    inputAccessoryView.frame.size.height等于44
    ,则隐藏输入附件视图的解决方案是覆盖
    setHidden:
    方法:

    - (void)setHidden:(BOOL)hidden {
        [super setHidden:self.customIsHiddenFlag];
    }  
    
    其中
    customishedendflag
    属性,您需要使用该属性来实现显示/隐藏附件视图的逻辑

    或覆盖
    setAlpha:
    方法:

    - (void)setAlpha:(CGFloat)alpha {
        [super setAlpha:(self.customIsHiddenFlag ? 0 : 1)];
    }
    
    这些解决方案适用于iOS 7

    对于iOS 6,您可以使用基本解决方案
    inputAccessoryView.hidden=YES
    ,这是因为当启动接口旋转时,iOS不会自动调用
    setHidden:NO


    看起来你是对的,这是iOS6和iOS7上不同行为的一个错误原因。如果苹果公司想要强制显示输入附件视图,那么他们应该调用
    setHidden:NO
    ,不仅在界面旋转之后,而且在所有者成为第一响应者时也是如此。

    来自苹果公司
    inputAccessoryView的文档:

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

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

    @property (nonatomic, readwrite) UIView *inputAccessoryView;
    
    从superview中删除附件视图,并在适当时将属性设置为零:

    - (IBAction)hideAccessoryView:(UIButton *)sender
    {
        [self.inputAccessoryView removeFromSuperview];
        self.inputAccessoryView = nil;
    }
    
    对于文档来说,这是正确的,但如果查看视图层次结构,则有一个UIPeripheralHostView(UIKit私有类)不会更改其大小。这很可能意味着丢弃附件视图将不会反映在键盘大小上-它将保持不变。如果您计划计算任何偏移量以适应屏幕键盘,请记住这一点

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

    编辑:

    下面是一个屏幕截图,显示了您的bug report应用程序的一个稍加修改的版本,其中突出显示了UIPeripheralHostView:


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

    尝试将附件更改为零高度,导致了许多其他错误,包括“虚假图层大小”警告和异常。看起来@Visput有正确的解决方案,但是,如果您不想覆盖方法,可以在视图控制器上的
    didRotateFromInterfaceOrientation
    中使用
    setAlpha
    。@WilliamGeorge-谢谢。实际上,您的解决方案启发我使用
    if([accessoryView isHidden])[accessoryView setAlpha:0.0f]didRotate…
    中,在调用
    becomefirstResponder
    的代码中,将alpha设置为1。如果苹果修复了这个缺陷,没有新的类,没有覆盖方法,仍然可以工作,没有测量高度,都是很好的解决方案。这个协议似乎只提供了通过视图进行布局的方法。似乎没有任何方法可以显式设置它,例如
    [self-setInputAccessoryView:nil]
    。没错,但您可以实现一个名为
    setAccessoryViewHidden:(BOOL)hidden
    的方法,该方法根据
    hidden
    将其设置为或设置为零。将其设置为
    nil
    是具有隐藏附件视图的唯一正确选项。我的第一个理论和利奥的一样,但不幸的是