Ios 第一次操作按钮的权限不正确
当点击四个按钮中的任何一个时,指示器总是第一次动画显示在最左侧按钮下的位置。但我想看到的是,指示灯滑到了刚刚按下的按钮正下方的位置。这四个按钮在情节提要中标记为0、1、2、3。为什么?提前谢谢你Ios 第一次操作按钮的权限不正确,ios,swift,uibutton,Ios,Swift,Uibutton,当点击四个按钮中的任何一个时,指示器总是第一次动画显示在最左侧按钮下的位置。但我想看到的是,指示灯滑到了刚刚按下的按钮正下方的位置。这四个按钮在情节提要中标记为0、1、2、3。为什么?提前谢谢你 class MainViewController: UIViewController { @IBOutlet weak var weatherBtn: UIButton! @IBOutlet weak var tourismBtn: UIButton! @IBOutlet we
class MainViewController: UIViewController {
@IBOutlet weak var weatherBtn: UIButton!
@IBOutlet weak var tourismBtn: UIButton!
@IBOutlet weak var tectonicsBtn: UIButton!
@IBOutlet weak var foodBtn: UIButton!
@IBOutlet weak var indicator: UIImageView!
var btnsArray: [UIButton]!
let tin = UIColor(red: 145/255, green: 145/255, blue: 145/255, alpha: 1)
override func viewDidLoad() {
super.viewDidLoad()
btnsArray = [weatherBtn, tourismBtn, tectonicsBtn, foodBtn]
indicator.image = UIImage().solidColor(.black, size: indicator.frame.size)
}
@IBAction func topicBtnTapped(_ sender: UIButton) {
indicate(button: sender)
}
func indicate(button: UIButton) {
UIView.animate(withDuration: 0.3) {
self.indicator.center.x = (button.superview?.frame.minX)! + button.frame.width * 0.5 * (2 * CGFloat(button.tag) + 1)
}
for btn in btnsArray {
btn.titleLabel?.textColor = tin
}
button.setTitleColor(.black, for: .normal)
}
}
extension UIImage {
func solidColor(_ color: UIColor, size: CGSize) -> UIImage {
let rect = CGRect(x: 0, y: 0, width: size.width, height: size.height)
UIGraphicsBeginImageContextWithOptions(size, false, 0)
color.setFill()
UIRectFill(rect)
let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return image
}
}
假设您使用的是自动布局约束 对于“指示器”
UIImageView
,在天气按钮底部设置宽度和高度限制以及垂直间距限制
然后,将其水平居中约束到天气按钮
为该centerX约束添加IBOutlet:
@IBOutlet var indicatorCenterXConstraint: NSLayoutConstraint!
然后,当您想要移动“指示器”时:
因此,每次点击“菜单”按钮时,都会停用当前centerXAnchor,将其重新初始化到点击按钮的centerXAnchor,重新激活它,并设置动画
下面是完整的课程:
class MenuMainViewController: UIViewController {
@IBOutlet weak var weatherBtn: UIButton!
@IBOutlet weak var tourismBtn: UIButton!
@IBOutlet weak var tectonicsBtn: UIButton!
@IBOutlet weak var foodBtn: UIButton!
@IBOutlet weak var indicator: UIImageView!
// outlet to control the position of the indicator
@IBOutlet var indicatorCenterXConstraint: NSLayoutConstraint!
var btnsArray: [UIButton]!
let tin = UIColor(red: 145/255, green: 145/255, blue: 145/255, alpha: 1)
override func viewDidLoad() {
super.viewDidLoad()
btnsArray = [weatherBtn, tourismBtn, tectonicsBtn, foodBtn]
indicator.image = UIImage().solidColor(.black, size: indicator.frame.size)
// init button title colors
for btn in btnsArray {
btn.setTitleColor(tin, for: .normal)
}
// set first button to "active" color
weatherBtn.setTitleColor(.black, for: .normal)
}
@IBAction func topicBtnTapped(_ sender: UIButton) {
indicate(button: sender)
}
func indicate(button: UIButton) {
// deactivate indicator's current centerXAnchor
self.indicatorCenterXConstraint.isActive = false
// re-init to center aligned to selected button
self.indicatorCenterXConstraint = self.indicator.centerXAnchor.constraint(equalTo: button.centerXAnchor)
// set it active
self.indicatorCenterXConstraint.isActive = true
// animate it into place
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
// update button title colors
for btn in btnsArray {
btn.setTitleColor(tin, for: .normal)
}
button.setTitleColor(.black, for: .normal)
}
}
顺便说一句,您可以使用带有
的普通UIView
和背景色=.black
来代替为“指示器”图像视图创建纯色图像,如果您使用这个->@dahiya\u男孩,效果会更好谢谢!但我只是想实现我现在的代码。不含可可豆。:)在故事板中布局时是否使用约束?如果是这样,您应该为约束创建IBOutlet
s,并更改.constant
值。将约束与显式帧值混合会有问题。@DonMag确实是。我现在已经解决了这个问题。谢谢非常感谢你!你对我说得很清楚,很详细!同时也感谢您的额外实施!
class MenuMainViewController: UIViewController {
@IBOutlet weak var weatherBtn: UIButton!
@IBOutlet weak var tourismBtn: UIButton!
@IBOutlet weak var tectonicsBtn: UIButton!
@IBOutlet weak var foodBtn: UIButton!
@IBOutlet weak var indicator: UIImageView!
// outlet to control the position of the indicator
@IBOutlet var indicatorCenterXConstraint: NSLayoutConstraint!
var btnsArray: [UIButton]!
let tin = UIColor(red: 145/255, green: 145/255, blue: 145/255, alpha: 1)
override func viewDidLoad() {
super.viewDidLoad()
btnsArray = [weatherBtn, tourismBtn, tectonicsBtn, foodBtn]
indicator.image = UIImage().solidColor(.black, size: indicator.frame.size)
// init button title colors
for btn in btnsArray {
btn.setTitleColor(tin, for: .normal)
}
// set first button to "active" color
weatherBtn.setTitleColor(.black, for: .normal)
}
@IBAction func topicBtnTapped(_ sender: UIButton) {
indicate(button: sender)
}
func indicate(button: UIButton) {
// deactivate indicator's current centerXAnchor
self.indicatorCenterXConstraint.isActive = false
// re-init to center aligned to selected button
self.indicatorCenterXConstraint = self.indicator.centerXAnchor.constraint(equalTo: button.centerXAnchor)
// set it active
self.indicatorCenterXConstraint.isActive = true
// animate it into place
UIView.animate(withDuration: 0.3) {
self.view.layoutIfNeeded()
}
// update button title colors
for btn in btnsArray {
btn.setTitleColor(tin, for: .normal)
}
button.setTitleColor(.black, for: .normal)
}
}