识别子视图的课程

时间:2016-01-08 00:20:15

标签: ios swift uiview

我决定手动设置对象的动画,因此为UIView类制作了扩展名:

public extension UIView{

    func slideOut(){
        UIView.animateWithDuration(0.5, animations: { self.frame.origin.x = -self.frame.width }, completion: finishedDisposing)
    }

    func finishedDisposing(successfully: Bool){
        if !successfully{
            ((UIApplication.sharedApplication().delegate as! AppDelegate).window!.rootViewController as! VC).showSystemMessage("Failed to dispose one or more subviews from superview", ofType: .NOTICE)
        }

        responder.viewDisposed()
    }

}

哪个好用,我对此没有任何问题,但我在VC中有一个方法(自定义UIViewControllerviewDisposed(),只要视图滑出视线并且它有这样的实现就会被调用:

func viewDisposed() {
        disposed++
        print("Updated disposed: \(disposed) / \(self.view.subviews.count)")

        if disposed == self.view.subviews.count - 1{
            delegate.vcFinishedDisposing()
        }
    }

它显示self.view.subviews包含我的所有自定义视图+ 3个以上(UIView,_UILayoutGuide x 2)。虽然不调用responder.viewDisposed方法,但它们确实扩展了UIView。我的决定是弄清楚如何获取每个子视图的类和Mirror(reflecting: subView).subjectType如果我打印它就会非常好。有没有办法真正将它与任何东西进行比较,或者更好的是,获得String表示?基本上,我希望你帮我创建一个方法来创建一个子视图的堆栈,这些子视图不是UIView类型(只有subClasses),也不是_UILayoutGuide。谢谢!

1 个答案:

答案 0 :(得分:1)

您可能最好直接创建一个只关注您所关注的子视图的数组,而不是从所有子视图开始并尝试过滤掉您不关心的子视图。这些布局指南并不总是存在 - 它们是在iOS 7中添加的。谁知道Apple将来会添加什么?

反正:

let mySubviews = view.subviews.filter {
    !["UIView", "_UILayoutGuide"].contains(NSStringFromClass($0.dynamicType))
}