gpt4 book ai didi

ios - 为什么当我点击第三个 tabbaritem 时,第三个 tabbaritem 和第四个项目交换位置?

转载 作者:行者123 更新时间:2023-11-28 13:01:54 26 4
gpt4 key购买 nike

我定制了一个UITabBar。在 UITabBar 的中心添加一个按钮。 tabbar 有 4 个 tabbaritems 和一个按钮。但是当我点击第三个 tabbaritem 时,它的位置变成了第四个项目的位置。第三个 tabbaritem 和第四个 item 交换它们的位置。

enter image description here enter image description here

我设置断点调试。我发现当我点击第三个 babbaritem tabBar 时调用 layoutSubviews(),但是当我点击其他三个 tabbaritems 时,tabbar 没有调用 layoutSubviews()。我不知道为什么。任何人都可以帮助我吗?

我上传代码。为每个 UITabBarButton 添加标签。然后使用标签乘以宽度。但是它有一个新的问题。第三项成为第一项。

enter image description here

这是固定的自定义 UITarbar。

    class YNNJTTabBar: UITabBar {

override func awakeFromNib() {
super.awakeFromNib()

self.addSubview(askQuestionButton)

addTagToUITarBarButton()
}


func addTagToUITarBarButton() {

var index = 0
for view in self.subviews {

if view is UIControl && !(view is UIButton) {

view.tag = index
index += (index == 1) ? 2 : 1

}
}
}

override func layoutSubviews() {
super.layoutSubviews()

let width = self.bounds.width / CGFloat(buttonCount)
let height = self.bounds.height
let frame = CGRect(x: 0, y: 0, width: width, height: height)

//set askQuestionButton's frame
let buttonFrame = CGRect(x: 0, y: 0, width: width - 12, height: height - 12)
askQuestionButton.frame = buttonFrame
askQuestionButton.center = CGPoint(x: self.bounds.width * 0.5, y: self.bounds.height * 0.5)

//set 4 item's frame

for view in self.subviews {

if view is UIControl && !(view is UIButton) {

print(view.tag)

view.frame = CGRectOffset(frame, width * CGFloat(view.tag), 0)

}


}

print(self.subviews as NSArray)
}


private let buttonCount = 5

let askQuestionButton: UIButton = {

let tempView = UIButton()

tempView.setBackgroundImage(UIImage(named: "askQuestionbtn"), forState: .Normal)
tempView.setTitle("问", forState: .Normal)
tempView.titleLabel?.font = UIFont.systemFontOfSize(22)

return tempView
}()
}

这是应用启动时的打印信息

0
1
3
4
(
"<_UITabBarBackgroundView: 0x7fe47bc0d580; frame = (0 0; 320 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fe47bc02740>>",
"<UITabBarButton: 0x7fe47bccb060; frame = (0 0; 64 49); opaque = NO; layer = <CALayer: 0x7fe47bca51f0>>",
"<UITabBarButton: 0x7fe47bccc9e0; frame = (64 0; 64 49); opaque = NO; tag = 1; layer = <CALayer: 0x7fe47bcccf80>>",
"<UITabBarButton: 0x7fe47bccea80; frame = (192 0; 64 49); opaque = NO; tag = 3; layer = <CALayer: 0x7fe47bccf020>>",
"<UITabBarButton: 0x7fe47bcd0ad0; frame = (256 0; 64 49); opaque = NO; tag = 4; layer = <CALayer: 0x7fe47bcd1050>>",
"<UIButton: 0x7fe47bcca690; frame = (134 6; 52 37); opaque = NO; layer = <CALayer: 0x7fe47bca3980>>",
"<UIImageView: 0x7fe47bc22b80; frame = (0 -0.5; 320 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fe47bc07b80>>"
)

当我点击第三个项目时

0
1
4
0
(
"<_UITabBarBackgroundView: 0x7fe47bc0d580; frame = (0 0; 320 49); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fe47bc02740>>",
"<UITabBarButton: 0x7fe47bccb060; frame = (0 0; 64 49); opaque = NO; layer = <CALayer: 0x7fe47bca51f0>>",
"<UITabBarButton: 0x7fe47bccc9e0; frame = (64 0; 64 49); opaque = NO; tag = 1; layer = <CALayer: 0x7fe47bcccf80>>",
"<UITabBarButton: 0x7fe47bcd0ad0; frame = (256 0; 64 49); opaque = NO; tag = 4; layer = <CALayer: 0x7fe47bcd1050>>",
"<UIButton: 0x7fe47bcca690; frame = (134 6; 52 37); opaque = NO; layer = <CALayer: 0x7fe47bca3980>>",
"<UIImageView: 0x7fe47bc22b80; frame = (0 -0.5; 320 0.5); autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x7fe47bc07b80>>",
"<UITabBarButton: 0x7fe47bcd0150; frame = (0 0; 64 49); opaque = NO; layer = <CALayer: 0x7fe47bcb8f10>>"
)

最佳答案

如果“self.subviews”返回的项目顺序不正确,为每个选项卡项目设置标签。标签值将为 0(用于搜索)、1(用于联系人)、3 和 4(用于设置)在 for 循环内部更改为:

if view is UIControl && !(view is UIButton) {
view.frame = CGRectOffset(frame, view.tag * width, 0)
}

关于ios - 为什么当我点击第三个 tabbaritem 时,第三个 tabbaritem 和第四个项目交换位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33664830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com