将标签的 center.x 与 tabBar 的 imageView 中的图像对齐

Posted

技术标签:

【中文标题】将标签的 center.x 与 tabBar 的 imageView 中的图像对齐【英文标题】:Align label's center.x with image inside tabBar's imageView 【发布时间】:2021-01-22 12:36:43 【问题描述】:

我需要让标签的center.x 直接与tabBar 的imageView 中的图像对齐。使用下面的代码,标签未对齐,而不是标签的文本“123”直接位于 tabBar 内的铃铛上方,而是向右偏。

guard let keyWindow = UIApplication.shared.windows.first(where:  $0.isKeyWindow ) else  return 

guard let fourthTab = tabBarController?.tabBar.items?[3].value(forKey: "view") as? UIView else  return 

guard let imageView = fourthTab.subviews.compactMap( $0 as? UIImageView ).first else  return 

guard let imageViewRectInWindow = imageView.superview?.superview?.convert(fourthTab.frame, to: keyWindow) else  return 

let imageRect = AVMakeRect(aspectRatio: imageView.image!.size, insideRect: imageViewRectInWindow)

myLabel.text = "123"
myLabel.textAlignment = .center // I also tried .left
myLabel.center.x = imageRect.midX
myLabel.center.y = UIScreen.main.bounds.height - 74
myLabel.frame.size.width = 50
myLabel.frame.size.height = 21

print("imageViewRectInWindow: \(imageViewRectInWindow)") // (249.99999999403948, 688.0, 79.00000000298022, 48.0)
print("imageRect: \(imageRect)") // (265.4999999955296, 688.0, 48.0, 48.0)
print("myLabelRect: \(myLabel.frame)") // (289.4999999955296, 662.0, 50.0, 21.0)

【问题讨论】:

这是你的答案***.com/a/65367010/14733292 吗? 这是我的问题,这是我赞成的你的答案,哈哈。 我正在使用 superView.,这部分工作正常。 你为什么不尝试设置约束 @LucaSfragara 你如何从 imageView 中的图像进行约束? 【参考方案1】:

这可能是一个布局问题,例如在布局所有内容之前设置坐标。你从哪里调用代码?我能够让它与以下内容一起工作,但是如果你使用的功能有些奇怪,所以删掉其中的几个。使用 tabview 的框架对我有用,并从视图控制器的 viewDidLayoutSubviews 函数调用坐标设置。

class ViewController: UIViewController 

    var myLabel: UILabel = UILabel()

    var secondTab: UIView?

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        self.view.addSubview(myLabel)
        myLabel.textColor = .black
        myLabel.text = "123"
        myLabel.textAlignment = .center // I also tried .left
        myLabel.frame.size.width = 50
        myLabel.frame.size.height = 21

        secondTab = tabBarController?.tabBar.items?[1].value(forKey: "view") as? UIView
    

    override func viewDidLayoutSubviews() 
        super.viewDidLayoutSubviews()

        guard let secondTab = secondTab else 
            return
        

        myLabel.center.x = secondTab.frame.midX
        myLabel.center.y = UIScreen.main.bounds.height - 70
    

【讨论】:

我保留了所有相同的代码。您正确的是将代码移至layoutSubviews()(我正在使用单元格)。感谢您的帮助!【参考方案2】:

尝试下面的代码,通过标签栏项目索引返回 centerX。

extension UIViewController 

    func centerX(of tabItemIndex: Int) -> CGFloat? 
        guard let tabBarItemCount = tabBarController?.tabBar.items?.count else  return nil 
        let itemWidth = view.bounds.width / CGFloat(tabBarItemCount)
        return itemWidth * CGFloat(tabItemIndex + 1) - itemWidth / 2
    

【讨论】:

以上是关于将标签的 center.x 与 tabBar 的 imageView 中的图像对齐的主要内容,如果未能解决你的问题,请参考以下文章

添加 TabBar 元素

隐藏 TabBar 控制器

TabBar 选择指示器图像在 Objective C 中没有占据 tabBar 高度的整个大小

将选项卡动态添加到 actionscript TabBar

TabBar 徽章事件和更改

隐藏 TabBar 时,ScrollView 与 VStack 中的文本重叠