Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITableView阻尼动画和布局约束_Ios_Iphone_Uitableview_Constraints_Ios Animations - Fatal编程技术网

Ios UITableView阻尼动画和布局约束

Ios UITableView阻尼动画和布局约束,ios,iphone,uitableview,constraints,ios-animations,Ios,Iphone,Uitableview,Constraints,Ios Animations,我试图通过使用UITableView的高度约束和UIView.animateWithDamping(..)块来设置UITableView的动画,使其像下拉菜单一样工作。我在tableView下遇到了白色背景的奇怪问题 我已经清除了每一种背景色,这没有多大帮助 下面是设置dropDownView的所有子视图的代码,它是一个UIView: required public init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder)

我试图通过使用UITableView的高度约束和UIView.animateWithDamping(..)块来设置UITableView的动画,使其像下拉菜单一样工作。我在tableView下遇到了白色背景的奇怪问题

我已经清除了每一种背景色,这没有多大帮助
下面是设置dropDownView的所有子视图的代码,它是一个UIView:

required public init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.elements = []
    defaultSetup()
}

private func defaultSetup() {
    configureActionButton()
    configureTableView()
}
private func configureActionButton() {
    actionButton = UIButton(frame: CGRectZero)
    actionButton.translatesAutoresizingMaskIntoConstraints = false
    addSubview(actionButton)
    guard let superview                                 = actionButton.superview else {
        assert(false, "ActionButton adding to superview failed.")
        return
    }
    // Constraints
    actionButton.constrain(.Leading, .Equal, superview, .Leading, constant: 0, multiplier: 1)?.constrain(.Trailing, .Equal, superview, .Trailing, constant: 0, multiplier: 1)?.constrain(.Top, .Equal, superview, .Top, constant: 0, multiplier: 1)?.constrain(.Bottom, .Equal, superview, .Bottom, constant: 0, multiplier: 1)
    // Appearance
    actionButton.backgroundColor                        = UIColor.clearColor()
    actionButton.opaque                                 = false
    actionButton.contentHorizontalAlignment             = .Left
    actionButton.contentEdgeInsets = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 0)
    if borderVisible {
        actionButton.layer.cornerRadius                 = 5
        actionButton.layer.borderColor                  = UIColor.blackColor().CGColor
        actionButton.layer.borderWidth                  = 1
        actionButton.clipsToBounds                      = true
    }
    // Actions
    actionButton.addTarget(self, action: "menuAction:", forControlEvents: .TouchUpInside)
}

private func configureTableView() {
    tableView                                           = BOTableView(frame: CGRectZero, items: elements, configuration: configuration)
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.delegate                                  = self
    tableView.dataSource                                = self
    addSubview(tableView)
    guard let tableViewSuperview = tableView.superview else {
        assert(false, "TableView adding to superview failed.")
        return
    }
    // Constraints
    tableView.constrain(.Trailing, .Equal, tableViewSuperview, .Trailing, constant: 0, multiplier: 1)?.constrain(.Top, .Equal, tableViewSuperview, .Bottom, constant: 0, multiplier: 1)?.constrain(.Leading, .Equal, tableViewSuperview, .Leading, constant: 0, multiplier: 1)
    tvHeightConstraint                                  = NSLayoutConstraint(item: tableView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1, constant: 0)
    tableView.addConstraint(tvHeightConstraint)

}
BOTableView类初始值设定项:

init(frame: CGRect, items: [String], configuration: BOConfiguration) {
    super.init(frame: frame, style: UITableViewStyle.Plain)

    self.items                              = items
    self.selectedIndexPath                  = NSIndexPath(forRow: 0, inSection: 0)
    self.configuration                      = configuration

    // Setup table view
    self.opaque                             = false
    self.backgroundView?.backgroundColor    = UIColor.clearColor()
    self.backgroundColor                    = UIColor.clearColor()
    self.separatorColor                     = UIColor.blackColor()
    self.scrollEnabled                      = false
    self.separatorStyle                     = .SingleLine

    self.layer.cornerRadius                 = 5
    self.layer.borderColor                  = UIColor.blackColor().CGColor
    self.layer.borderWidth                  = 1
    self.clipsToBounds                      = true
}
UIView动画:

private func showMenuWithCompletionBlock(completion: (succeeded: Bool) -> Void) {
    delegate?.menuWillShow(self)
    let tvHeight                            = frame.size.height * CGFloat(elements.count)
    tvHeightConstraint.constant             = tvHeight

    UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.4, initialSpringVelocity: 0.5, options: .CurveEaseInOut, animations: { [weak self] () -> Void in
            guard let strongSelf = self else {
                completion(succeeded: false)
                return
            }
            strongSelf.layoutIfNeeded()
            }, completion: { (finished) -> Void in
                if finished {
                    completion(succeeded: true)
                }
        })
}
以下是UIView+约束扩展的代码,用于代码:

extension UIView {
/**
 :returns: true if v is in this view's super view chain
 */
public func isSuper(v : UIView) -> Bool
{
    for var s : UIView? = self; s != nil; s = s?.superview {
        if(v == s) {
            return true;
        }
    }
    return false
}

public func constrain(attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, _ otherView: UIView, _ otherAttribute: NSLayoutAttribute, constant: CGFloat = 0.0, multiplier : CGFloat = 1.0) -> UIView?
{
    let c = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: relation, toItem: otherView, attribute: otherAttribute, multiplier: multiplier, constant: constant)

    if isSuper(otherView) {
        otherView.addConstraint(c)
        return self
    }
    else if(otherView.isSuper(self) || otherView == self)
    {
        self.addConstraint(c)
        return self
    }
    assert(false)
    return nil
}

public func constrain(attribute: NSLayoutAttribute, _ relation: NSLayoutRelation, constant: CGFloat, multiplier : CGFloat = 1.0) -> UIView?
{
    let c = NSLayoutConstraint(item: self, attribute: attribute, relatedBy: relation, toItem: nil, attribute: .NotAnAttribute, multiplier: multiplier, constant: constant)
    self.addConstraint(c)
    return self
}
}


当我试图在debugger中调试视图的层次结构时,唯一的白色背景视图是tableView,但我已经在代码中清除了背景。我还尝试将tableView的backgroundView设置为nil,并将backgroundView.backgroundColor设置为clearColor()。没有什么变化

可能尝试将UITableView页脚设置为空白视图,但不知道为什么,但它可以帮助您解决类似问题

    [_tableView setTableFooterView:[[UIView alloc] init]];

尝试将tableView的背景色更改为tableViewCell的背景色。这也不起作用。下面的背景仍然是白色的。恐怕下面的视图实际上不是一个tableView,而是为了动画而创建的。嗯,好的,一旦你在模拟器上运行应用程序,回到Xcode选择调试>视图调试>捕获视图层次结构,它将在Xcode中打开,然后选择第四个看起来像立方体的图标,当它变成网格时,然后你可以得到一个360度的模拟器视图,看看到底是哪个视图是白色的,正如我在上面的问题描述中提到的那样。调试器说白色背景属于tableView.my bad,但是当您将tableView的背景颜色设置为红色时,您现在看到白色的地方是否看到红色?