自定义分段控件不切换视图

杰布

我做了一个自定义的 UIControl:

import UIKit

    @IBDesignable class FeedViewSC: UIControl {

    fileprivate var labels = [UILabel]()
    var thumbView = UIView()

    var items: [String] = ["Tab1", "Tab2"] {
        didSet {
            setupLabels()
        }

    }

    var selectedIndex : Int = 0 {
        didSet{
            displayNewSelectedIndex()
        }
    }

    @IBInspectable var font : UIFont! = UIFont.systemFont(ofSize: 13) {
        didSet {
            setFont()
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        setupView()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        setupView()
    }

    func setupView() {

        layer.cornerRadius = 5
        layer.borderColor = UIColor(red: 239/255, green: 239/255, blue: 239/255, alpha: 1).cgColor
        layer.borderWidth = 2

        backgroundColor = UIColor(red: 239/255, green: 239/255, blue: 239/255, alpha: 1)

        setupLabels()

        insertSubview(thumbView, at: 0)

    }


    func setupLabels() {
        for label in labels {
            label.removeFromSuperview()
        }

        labels.removeAll(keepingCapacity: true)

        for index in 1...items.count {
            let label = UILabel(frame: CGRect.zero)
            label.text = items[index-1]
            label.textAlignment = .center
            label.font = UIFont(name: "Nunito",size: 17)
            label.textColor = UIColor(red: 51/255, green: 51/255, blue: 51/255, alpha: 1)
            self.addSubview(label)
            labels.append(label)
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        var selectFrame = self.bounds
        let newWidth = selectFrame.width / CGFloat(items.count)
        selectFrame.size.width = newWidth
        thumbView.frame = selectFrame
        thumbView.backgroundColor = UIColor(red: 255/255, green: 255/255, blue: 255/255, alpha: 1)
        thumbView.layer.cornerRadius = 5

        let labelHeight = self.bounds.height
        let labelWidth = self.bounds.width / CGFloat(labels.count)

        for index in 0...labels.count - 1 {

            let label = labels[index]

            let xPosition = CGFloat(index) * labelWidth
            label.frame = CGRect(x: xPosition, y: 0, width: labelWidth, height: labelHeight)
        }

    }

    override func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
        let location = touch.location(in: self)

        var calculatedIndex: Int?
        for (index, item) in labels.enumerated() {
            if item.frame.contains(location){
                calculatedIndex = index
            }
        }
        if calculatedIndex != nil {
            selectedIndex = calculatedIndex!
            sendActions(for: .valueChanged)
        }

        return false

    }


    func displayNewSelectedIndex (){

        if(self.selectedIndex == -1){
            self.selectedIndex = self.items.count-1
        }

        let label = labels[selectedIndex]


        UIView.animate(withDuration: 0.5, delay: 0.0, usingSpringWithDamping: 0.90, initialSpringVelocity: 0.8, options: [], animations: {

            self.thumbView.frame = label.frame

        }, completion: nil)
    }

    func setFont(){
        for item in labels {
            item.font = font
        }
    }

}

我将其嵌入到ViewController中,并尝试使其在两个视图之间进行编程切换:

import UIKit

    class FeedViewController: UIViewController {

    let feedViewSC = FeedViewSC()

    let firstView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.red
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    let secondView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.blue
        view.translatesAutoresizingMaskIntoConstraints = false
        return view
    }()

    let (width, height) = UIScreen.main.bounds.wh

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white
        view.addSubview(firstView)
        view.addSubview(secondView)

        setupContainerViews()

        firstView.isHidden = false
        secondView.isHidden = true

        myTravel.selectedIndex = 0

        let feedControl = FeedViewSC(frame: CGRect(x: 65, y: 5, width: width-130, height: 35))
        feedControl.autoresizingMask = [.flexibleWidth,.flexibleHeight]

        self.navigationController?.navigationBar.addSubview(feedControl)
        feedControl.addTarget(self, action: #selector(segmentedControlSwitch), for: .valueChanged)
    }

    func segmentedControlSwitch(_ sender: FeedViewSC) {
        switch feedViewSC.selectedIndex {

        case 0:
            firstView.isHidden = false
            secondView.isHidden = true

        case 1:
            firstView.isHidden = true
            secondView.isHidden = false


        default:
            break;
        }
    }

    func setupContainerViews() {

        firstView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        firstView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8).isActive = true
        firstView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
        firstView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

        secondView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        secondView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8).isActive = true
        secondView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
        secondView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

    }

    override func viewDidAppear(_ animated: Bool) {
        let img = UIImage()
        self.navigationController?.navigationBar.shadowImage = img
        self.navigationController?.navigationBar.setBackgroundImage(img, for: UIBarMetrics.default)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

extension CGRect {
    var wh: (w: CGFloat, h: CGFloat) {
        return (size.width, size.height)
    }
}

我不确定我在做什么,这是错误的。出于某种原因,代码不会在 firstView 和 secondView 之间切换。目前,它只是显示第一个视图。请记住,我是在没有故事板的情况下以编程方式执行此操作的。

吉滕德拉·辛格

问题似乎出现在 segmentedControlSwitch 方法中。您应该在 switch case 中使用 sender 而不是可能未初始化的局部变量。

func segmentedControlSwitch(_ sender: myTripsSC) {
    switch sender.selectedIndex {

    case 0:
        firstView.isHidden = false
        secondView.isHidden = true

    case 1:
        firstView.isHidden = true
        secondView.isHidden = false


    default:
        break;
    }
}

编辑:你的 vc 应该是这样的:

import UIKit

class FeedViewController: UIViewController {

let feedViewSC = FeedViewSC()

let firstView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.red
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let secondView: UIView = {
    let view = UIView()
    view.backgroundColor = UIColor.blue
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let (width, height) = UIScreen.main.bounds.wh

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.white
    view.addSubview(firstView)
    view.addSubview(secondView)

    setupContainerViews()

    firstView.isHidden = false
    secondView.isHidden = true

    //myTravel.selectedIndex = 0

    let feedControl = FeedViewSC(frame: CGRect(x: 65, y: 5, width: width-130, height: 35))
    feedControl.autoresizingMask = [.flexibleWidth,.flexibleHeight]

    self.navigationController?.navigationBar.addSubview(feedControl)
    feedControl.addTarget(self, action: #selector(segmentedControlSwitch), for: .valueChanged)
}

func segmentedControlSwitch(_ sender: FeedViewSC) {
    switch sender.selectedIndex {

    case 0:
        firstView.isHidden = false
        secondView.isHidden = true

    case 1:
        firstView.isHidden = true
        secondView.isHidden = false


    default:
        break;
    }
}

func setupContainerViews() {

    if #available(iOS 9.0, *) {
        firstView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        firstView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        firstView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        firstView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }

    if #available(iOS 9.0, *) {
        secondView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        secondView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: 8).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        secondView.bottomAnchor.constraint(equalTo: bottomLayoutGuide.topAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }
    if #available(iOS 9.0, *) {
        secondView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    } else {
        // Fallback on earlier versions
    }

}

override func viewDidAppear(_ animated: Bool) {
    let img = UIImage()
    self.navigationController?.navigationBar.shadowImage = img
    self.navigationController?.navigationBar.setBackgroundImage(img, for: UIBarMetrics.default)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

extension CGRect {
    var wh: (w: CGFloat, h: CGFloat) {
        return (size.width, size.height)
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Swift-分段控件-切换多个视图

来自分类Dev

分段控件可切换多个表视图

来自分类Dev

分段控件可切换多个表视图

来自分类Dev

使用分段控件切换*和刷新*子视图

来自分类Dev

如何添加[UP] -3 [DOWN]控件在自定义地图的图层之间切换?

来自分类Dev

iOS-以编程方式切换视图控制器中的自定义动画

来自分类Dev

具有自定义视图的ActionBar选项卡未切换

来自分类Dev

在自定义列表视图中切换 ImageView 按钮

来自分类Dev

Swift分段控件从导航标题切换多个视图

来自分类Dev

使用复选框简化在自定义控件中打开和关闭图层的切换吗?

来自分类Dev

使用复选框简化自定义控件中图层的打开和关闭切换?

来自分类Dev

PHP不切换

来自分类Dev

SWRevealViewController不切换

来自分类Dev

菜单不切换

来自分类Dev

在Access中制作自定义切换按钮

来自分类Dev

ReactJS中的自定义图像切换按钮

来自分类Dev

动作栏抽屉切换自定义图标

来自分类Dev

在AngularJS中切换自定义排序图标

来自分类Dev

Flutter-自定义切换按钮选择

来自分类Dev

Polylang自定义语言切换器

来自分类Dev

动作栏抽屉切换自定义图标

来自分类Dev

FooTable自定义切换按钮

来自分类Dev

jQuery 切换自定义动画

来自分类Dev

React Native 自定义切换按钮组件

来自分类Dev

带动画的自定义圆形切换按钮

来自分类Dev

在自定义 UITableViewCell 中设置切换目标

来自分类Dev

自定义分段控件还是..?

来自分类Dev

切换按钮在Android上不切换

来自分类Dev

引导导航栏不切换