无法从UITabBar swift获取UIImageView

时间:2017-04-17 09:07:05

标签: ios swift uiimageview uitabbar uitabbaritem

我正在关注tutorial动画标签栏图片。给定的代码行对我不起作用

secondItemView.subviews.first as! UIImageView

因为它获取UITabBarButtonLabel类型的数据而不是UIImageView。 我添加了标记值1,以便我可以使用标记值获取UIImageView enter image description here

secondItemView.viewWithTag(1)

返回nil。获取UIImageView参考的另一种方法是什么?

代码

@objc public class MTMainScreenTabsController : UITabBarController {
var secondItemImageView: UIImageView!
public override func viewDidLoad() {
    super.viewDidLoad()
    let secondItemView = self.tabBar.subviews[0]


    print(secondItemView.subviews)
    print(secondItemView.viewWithTag(1))

    //self.secondItemImageView = secondItemView.subviews.secon
    var item: UITabBarItem! = self.tabBar.items![0]


    //self.secondItemImageView = secondItemView.viewWithTag(1) as! UIImageView
}

public override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}

public override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    if item.tag == 1 {
        self.secondItemImageView.transform = .identity
        UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseInOut, animations: {
            () -> Void in
                //let rotation = CGAffineTransformMakeRotation(CGFloat(M_PI_2))
            let rotation = CGAffineTransform.init(rotationAngle: CGFloat(Double.pi/2))
                self.secondItemImageView.transform = rotation
        }, completion: nil)
    }
}

}

2 个答案:

答案 0 :(得分:2)

严格依赖子视图的顺序并不是一个好习惯,因为它可能在将来发生变化。如果您确定secondItemView.subviews包含UIImageView的实例,则可以这样找到:

let imageView = secondItemView.subviews.flatMap { $0 as? UIImageView }.first

如果存在此类型的子视图,imageView变量将是可选的,包含nil或实际UIImageView。平面地图将迭代子视图并尝试将每个转换为UIImageView - 如果失败,结果将被过滤掉,否则它将被放入您从中获取第一个元素的结果数组中。

答案 1 :(得分:-1)

使用我的代码,这个可以帮助你

class AnimatedTabBarController: UITabBarController {

    var secondItemImageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let secondItemView = self.tabBar.subviews[1]
        self.secondItemImageView = secondItemView.subviews.first as! UIImageView
        self.secondItemImageView.contentMode = .center

    }

    override func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {

        if item.tag == 1{
            //do our animations

            self.secondItemImageView.transform = CGAffineTransform.identity

            UIView.animate(withDuration: 0.7, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: UIViewAnimationOptions(), animations: { () -> Void in

                let rotation = CGAffineTransform(rotationAngle: CGFloat(M_PI_2))
                self.secondItemImageView.transform = rotation

                }, completion: nil)
        }
    }  
}