在我的情况下,我使用UITextField
作为附件,我不需要一直显示。我已确认在方向通知事件触发后发生了更改。我想一个黑客将把配件的大小调整为零高度,但我不愿意这样做。
想知道是否有人遇到过此问题并找到解决方案?
已输入错误报告并提供了示例项目。对于那些拥有更高权限的人,可以在bugreport.apple.com上搜索ID 16771757.我还将其复制到可以https://www.dropbox.com/s/o28vo04ig3yhgz6/ID16771757.zip访问的Dropbox帐户。
感谢您的阅读。
答案 0 :(得分:5)
iOS为输入附件视图实例调用此类方法:
[inputAccessoryView setAlpha:1];
当附件视图的所有者成为第一响应者时(内部方法调用-[UIPeripheralHost(UIKitInternal) executeTransition:]
); [inputAccessoryView setHidden:NO];
(内部方法调用-[UIPeripheralHost finishRotationOfKeyboard:]
); 这就是为什么输入附件视图在界面旋转事件后变得可见。
解决方案取决于您期望的行为:
让我们想象一下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:
在删除附件视图后,您可以看到视图的大小保持不变。
答案 2 :(得分:1)
当您添加附件视图时,您将通过"传递"它到系统进行布局。很可能,当Apple在键盘视图上执行布局时,它还会布局附件视图并将其设置为可见。将附件设置为隐藏也可能会产生其他副作用,例如键盘高度计算不正确,从而导致插入计算错误。
根据我的经验,最好取下配件并在必要时再次添加。调整附件视图的大小将导致与键盘大小相关的其他问题。如果要快速隐藏和显示,请为包含附件视图的视图创建子类,并在内部实现设置和删除附件视图。