Navigation Item titleView中图片旋转后转场结束复原问题求助
这个问题我之前也碰到过!本质原因是导航栏在转场完成后会重新布局titleView,这会把你之前设置的transform给重置掉。下面给你几个可行的解决办法:
方法一:在视图布局完成后重新设置旋转
你可以在viewDidAppear(_:)或者viewDidLayoutSubviews()方法里重新应用旋转,因为这两个方法会在转场结束、布局完全稳定后被调用:
override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let titleImageView = navigationItem.titleView as? UIImageView { titleImageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } }
或者用viewDidLayoutSubviews(),记得加个判断避免重复设置:
private var hasAppliedRotation = false override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() guard !hasAppliedRotation, let titleImageView = navigationItem.titleView as? UIImageView else { return } titleImageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) hasAppliedRotation = true }
方法二:自定义UIImageView子类,确保旋转始终生效
创建一个自定义的UIImageView,在layoutSubviews()里强制保持旋转状态,这样不管导航栏怎么布局,都不会重置你的transform:
class RotatedImageView: UIImageView { override func layoutSubviews() { super.layoutSubviews() // 这里设置你需要的旋转角度 transform = CGAffineTransform(rotationAngle: CGFloat.pi) } }
然后替换原来的UIImageView使用这个子类:
let arrImage = RotatedImageView(image: #imageLiteral(resourceName: "arrow")) arrImage.frame = CGRect(x: 0, y: 0, width: 30, height: 30) navigationItem.titleView = arrImage
额外提示:如果需要动画旋转
如果你是想要转场过程中伴随动画旋转,那可以用UIView.animate包裹transform设置,同时结合viewWillAppear(_:):
override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) UIView.animate(withDuration: 0.3) { if let titleImageView = self.navigationItem.titleView as? UIImageView { titleImageView.transform = CGAffineTransform(rotationAngle: CGFloat.pi) } } }
这样既保证动画效果,转场后也能保持旋转状态~
内容的提问来源于stack exchange,提问作者Nikhil Muskur
相关产品推荐
相关产品推荐

