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
是具有隐藏附件视图的唯一正确选项。我的第一个理论和利奥的一样,但不幸的是