Swift inputAccessoryView 覆盖错误
Posted
技术标签:
【中文标题】Swift inputAccessoryView 覆盖错误【英文标题】:Swift inputAccessoryView override bug 【发布时间】:2014-08-07 17:12:42 【问题描述】:我的inputAccessoryView
出现时遇到了一个奇怪的错误。在过渡期间,它看起来像这样:
过渡后,它应该是这样的:
我像这样覆盖属性:
override var inputAccessoryView: UIView!
get
if composeView == nil
composeView = CommentComposeView(frame: CGRectMake(0, 0, 0, MinimumToolbarHeight - 0.5))
self.setupSignals()
return composeView
我想知道是否有人可以指出我正在做的事情中的任何明显缺陷,或者提供更多信息来说明如何确保我的视图在转换之前、期间和之后按应有的方式显示。
谢谢!
编辑
这是我的CommentComposeView
:
import UIKit
class CommentComposeView: UIToolbar
var textView: SAMTextView!
var sendButton: UIButton!
private var didSetConstraints: Bool = false
required init(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
self.initialize()
override init(frame: CGRect)
super.init(frame: frame)
self.initialize()
private func initialize()
textView = SAMTextView(frame: CGRectZero)
sendButton = UIButton.buttonWithType(.System) as UIButton
self.barStyle = .Black
self.translucent = true
textView.backgroundColor = UIColor.presentOffWhite()
textView.font = UIFont.presentLightMedium()
textView.layer.borderWidth = 0.5
textView.layer.cornerRadius = 5
textView.placeholder = "Comment"
textView.scrollsToTop = false
textView.textContainerInset = UIEdgeInsetsMake(4, 3, 3, 3)
textView.keyboardAppearance = .Dark
textView.keyboardType = .Twitter
self.addSubview(textView)
sendButton = UIButton.buttonWithType(.System) as UIButton
sendButton.enabled = false
sendButton.titleLabel!.font = UIFont.presentBoldLarge()
sendButton.setTitle("Send", forState: .Normal)
sendButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
sendButton.setTitleColor(UIColor.presentCyan(), forState: .Highlighted)
sendButton.setTitleColor(UIColor.presentLightGray(), forState: .Disabled)
sendButton.contentEdgeInsets = UIEdgeInsetsMake(6, 6, 6, 6)
self.addSubview(sendButton)
RAC(self.sendButton, "enabled") <~ self.textView.rac_textSignal()
.map text in
return (text as NSString).length > 0
textView.setTranslatesAutoresizingMaskIntoConstraints(false)
sendButton.setTranslatesAutoresizingMaskIntoConstraints(false)
override func updateConstraints()
super.updateConstraints()
if !didSetConstraints
// TODO: Replace raw constraints with a friendlier looking DSL
self.addConstraint(
NSLayoutConstraint(item: textView, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1, constant: 8)
)
self.addConstraint(
NSLayoutConstraint(item: textView, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1, constant: 7.5)
)
self.addConstraint(
NSLayoutConstraint(item: textView, attribute: .Right, relatedBy: .Equal, toItem: sendButton, attribute: .Left, multiplier: 1, constant: -2)
)
self.addConstraint(
NSLayoutConstraint(item: textView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: -8)
)
self.addConstraint(
NSLayoutConstraint(item: sendButton, attribute: .Right, relatedBy: .Equal, toItem: self, attribute: .Right, multiplier: 1, constant: 0)
)
self.addConstraint(
NSLayoutConstraint(item: sendButton, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1, constant: -4.5)
)
【问题讨论】:
如果此问题仍然是最新的,请提供完整的示例。您在哪些 ios 版本上遇到过此问题? iOS 8。您还需要什么?我的实际CommentComposeView
?
【参考方案1】:
这是 iOS8 的 inputAccessoryView 自动布局问题。问题是 UIToolbar 的 clas _UIToolbarBackground
子视图在初始布局期间未正确定位。尝试做接下来的事情:
-
使
CommentComposeView
子类化UIView
,而不是UIToolbar
,添加UIToolbar
的实例作为子视图。
在CommentComposeView
中使用自动布局掩码(不是实际约束)
在您的CommentComposeView
中覆盖-layoutSubviews
,如下所示:
- (void)layoutSubviews
[super layoutSubviews];
contentToolbar.frame = self.bounds;
sendButton.frame = CGRectMake(0.f, 0.f, 44.f, self.bounds.size.height);
textView.frame = CGRectMake(44.f, 0.f, self.bounds.size.width - 44.f, self.bounds.size.height);
【讨论】:
我按照你的建议做了所有的事情,但我仍然遇到同样的问题。你有实验中的示例代码吗? 对不起,我的错在这里,似乎没有解决办法。当您执行滑动弹出手势时,工具栏的背景也会变得透明。此外,当您使用输入附件视图并弹回时,您的视图控制器不会被释放。 我遇到了类似的问题(UIToolbar
在viewWillDisappear
期间出现黑色)您回答的第 1 步为我解决了这个问题。我还将包含UIView
的背景颜色设置为白色。
这个解决方案对我有用***.com/questions/34289951/…以上是关于Swift inputAccessoryView 覆盖错误的主要内容,如果未能解决你的问题,请参考以下文章
swift如何将inputAccessoryView停靠在UIToolbar上方(不是底部)
如何在 inputAccessoryView [Swift] 中实现滚动视图
旋转后Swift inputAccessoryView未附加到键盘
如何使用 Swift 在 CustomCell 中实现 inputAccessoryView 到 UITextField?
ios8 swift:我如何访问/编辑/删除默认/私有 inputAccessoryView 高度约束'_UIKBAutolayoutHeightConstraint'