2017-04-17 83 views
1

我正在關注tutorial以爲標籤欄圖像設置動畫。代碼給定的行,因爲它得到類型UITabBarButtonLabel而不是UIImageView的數據不適合我無法從UITabBar快速獲取UIImageView

secondItemView.subviews.first as! 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) 
    } 
} 

}

+0

給標籤欄標籤1並檢查它 –

+0

你能用更多的代碼更新你的問題嗎? –

+0

@LuanTran添加的代碼 –

回答

1

這不是一個很好的做法,嚴格依子視圖的順序,因爲它可能會改變在未來。如果你確信secondItemView.subviews包含UIImageView一個實例,你可以找到這樣的:

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

imageView變量將是一個可選的包含兩種nil或實際UIImageView如果有任何這種類型的子視圖。平面地圖將遍歷子視圖,並嘗試將每個投射到UIImageView - 如果失敗,結果將被過濾掉,否則它將被放入結果數組中,從中獲取第一個元素。

0

使用我的代碼,這個人是幫你

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) 
     } 
    } 
}