Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何组合只设置分段控件样式的重复代码?_Ios_Swift - Fatal编程技术网

Ios 如何组合只设置分段控件样式的重复代码?

Ios 如何组合只设置分段控件样式的重复代码?,ios,swift,Ios,Swift,初学者在此提出一个初学者问题: 我的视图控制器中有3个分段控件,我有3个几乎相同的函数来设置它们的颜色/样式/动画。我知道我不应该重复代码,但我不完全确定如何组合这些代码。这可能是显而易见的,但我需要看到它完成,这样我就可以在我的应用程序的其他部分完成它。有人能给我举个例子吗: class Example: UIViewController { @IBOutlet weak var segmentedControl: UISegmentedControl! @IBOutlet we

初学者在此提出一个初学者问题:

我的视图控制器中有3个分段控件,我有3个几乎相同的函数来设置它们的颜色/样式/动画。我知道我不应该重复代码,但我不完全确定如何组合这些代码。这可能是显而易见的,但我需要看到它完成,这样我就可以在我的应用程序的其他部分完成它。有人能给我举个例子吗:

class Example: UIViewController {

  @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var textSegmentedControl: UISegmentedControl!
    @IBOutlet weak var translationSegmentedControl: UISegmentedControl!

override func viewDidLoad() {
        super.viewDidLoad()

        setMainSegmentedControlStyle()
        setTextSegmentedControlStyle()
        setTranslationSegmentedControlStyle()
}


func setTextSegmentedControlStyle() {
        textSegmentedControl.backgroundColor = .clear
        textSegmentedControl.tintColor = .clear
        textSegmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16), NSAttributedStringKey.foregroundColor: UIColor.lightGray
            ], for: .normal)
        textSegmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16),
            NSAttributedStringKey.foregroundColor: UIColor.darkGray
            ], for: .selected)
    let textSegmentedUnderline = UIView()

        textSegmentedUnderline.translatesAutoresizingMaskIntoConstraints = false // false since we are using auto layout constraints
        textSegmentedUnderline.backgroundColor = #colorLiteral(red: 0.992502749, green: 0.532302916, blue: 0.08773707598, alpha: 1)
        view.addSubview(textSegmentedUnderline)
        textSegmentedUnderline.topAnchor.constraint(equalTo: textSegmentedControl.bottomAnchor).isActive = true
        textSegmentedUnderline.heightAnchor.constraint(equalToConstant: 3).isActive = true
        textSegmentedUnderline.leftAnchor.constraint(equalTo: textSegmentedControl.leftAnchor).isActive = true
        textSegmentedUnderline.widthAnchor.constraint(equalTo: textSegmentedControl.widthAnchor, multiplier: 1 / CGFloat(textSegmentedControl.numberOfSegments)).isActive = true
        UIView.animate(withDuration: 0.3) {
            self.textSegmentedUnderline.frame.origin.x = (self.textSegmentedControl.frame.width / CGFloat(self.textSegmentedControl.numberOfSegments)) * CGFloat(self.textSegmentedControl.selectedSegmentIndex)
        }
    }

    func setTranslationSegmentedControlStyle() {
        translationSegmentedControl.backgroundColor = .clear
        translationSegmentedControl.tintColor = .clear
        translationSegmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16), NSAttributedStringKey.foregroundColor: UIColor.lightGray
            ], for: .normal)
        translationSegmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16), NSAttributedStringKey.foregroundColor: UIColor.darkGray
            ], for: .selected)
    let translationSegmentedUnderline = UIView()
       translationSegmentedUnderline.translatesAutoresizingMaskIntoConstraints = false // false since we are using auto layout constraints
        translationSegmentedUnderline.backgroundColor = #colorLiteral(red: 0.992502749, green: 0.532302916, blue: 0.08773707598, alpha: 1)
        view.addSubview(translationSegmentedUnderline)
        translationSegmentedUnderline.topAnchor.constraint(equalTo: textSegmentedControl.bottomAnchor).isActive = true
        translationSegmentedUnderline.heightAnchor.constraint(equalToConstant: 3).isActive = true
        translationSegmentedUnderline.leftAnchor.constraint(equalTo: translationSegmentedControl.leftAnchor).isActive = true
        translationSegmentedUnderline.widthAnchor.constraint(equalTo: translationSegmentedControl.widthAnchor, multiplier: 1 / CGFloat(translationSegmentedControl.numberOfSegments)).isActive = true
        UIView.animate(withDuration: 0.3) {
            self.translationSegmentedUnderline.frame.origin.x = (self.textSegmentedControl.frame.width / CGFloat(self.translationSegmentedControl.numberOfSegments)) * CGFloat(self.translationSegmentedControl.selectedSegmentIndex)
        }
    }

    func setMainSegmentedControlStyle() {
        segmentedControl.backgroundColor = .clear
        segmentedControl.tintColor = .clear
        segmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16), NSAttributedStringKey.foregroundColor: UIColor.lightGray
            ], for: .normal)
        segmentedControl.setTitleTextAttributes([NSAttributedStringKey.font : UIFont.systemFont(ofSize: 16),
                                                 NSAttributedStringKey.foregroundColor: UIColor.darkGray
            ], for: .selected)
        let buttonBar = UIView()
        buttonBar.translatesAutoresizingMaskIntoConstraints = false // false since we are using auto layout constraints
        buttonBar.backgroundColor = #colorLiteral(red: 0.992502749, green: 0.532302916, blue: 0.08773707598, alpha: 1)
        view.addSubview(buttonBar)
        buttonBar.topAnchor.constraint(equalTo: segmentedControl.bottomAnchor).isActive = true
        buttonBar.heightAnchor.constraint(equalToConstant: 3).isActive = true
        buttonBar.leftAnchor.constraint(equalTo: segmentedControl.leftAnchor).isActive = true
        buttonBar.widthAnchor.constraint(equalTo: segmentedControl.widthAnchor, multiplier: 1 / CGFloat(segmentedControl.numberOfSegments)).isActive = true
        UIView.animate(withDuration: 0.3) {
            self.buttonBar.frame.origin.x = (self.segmentedControl.frame.width / CGFloat(self.segmentedControl.numberOfSegments)) * CGFloat(self.segmentedControl.selectedSegmentIndex)
        }
    }

}

如果所有样式代码完全相同,则可以声明接受控件作为参数的函数:

func style(control: UISegmentedControl) {
    control.backgroundColor = .clear
    // continue styling here
}
然后,不管需要多少次,只要调用该函数,传入每个控件:

style(control: segmentedControl)
style(control: textSegmentedControl)
style(control: translationSegmentedControl)

不过,请注意,您应该在故事板中设置尽可能多的内容(例如backgroundColor),而不是代码。

有一个带参数的函数。