Swift - 如何获取按钮的 titleLabel 的中心框而不是按钮本身

Swift -How to get the center frame of a button's titleLabel and not the button itself

我有一个自定义分段控件,有 4 个段,每个段有一个按钮。我不得不更改按钮的 contentEdgeInsets:

// eg of the second button
customSegmentedControl.secondButton?.contentEdgeInsets = UIEdgeInsets(top: 0, left: -35, bottom: 0, right: 0)

滑块最初使用button.frame.midX滑动到每个段。更改 contentEdgeInsets 后,当滑块滑动到某个段时,它看起来好像在错误的位置,因为标题不再位于按钮的中心。我试图将滑块更改为滑动到按钮的中心 button.titleLabel: button.titleLabel!.frame.midX 但是在滑块滑动不正确的地方出现了一个奇怪的错误。

for button in buttons {
            
    UIView.animate(withDuration: 0.2, animations: {

        self.slider.frame.origin.x = button.titleLabel!.frame.midX // button.frame.midX was what was originally used
         // if it's the selected button break ...
    })
}

如何让滑块滑动到按钮的中心titleLabel?例如,我希望它滑动到 Pencil 这个词的中间,它是按钮的标题,其 contentEdgeInsets 已更改,而不是按钮本身的中间。

只是坐标系的问题。你不知道坐标系 button.titleLabel!.frame 是什么,所以你有这个 CGRect 但它对你没有用。

但是您确实知道 滑块的 frame 需要在哪个坐标系中;它是在其超级视图方面。

所以button.titleLabel!.frame转换为滑块父视图的坐标系,现在就可以有意义地移动滑块了。

let convertedRect = slider.superview!.convert(button.titleLabel!.frame, from: button.titleLabel!)