2017-12-04 12 views
0

탭브 컨트롤러의 하위 탭으로 분할 컨트롤을 사용하고 있습니다. 두 번째 탭 (하위 탭이있는 탭)으로 전환하고 UISegmentedControl을 프로그래밍 방식으로 첫 번째 탭 (0 개 인덱스)으로 전환해야하는 기본 탭에 버튼이 있습니다.UISegmentControl을 프로그래밍 방식으로 업데이트하지 않으면 선택되지 않은 세그먼트의 글꼴 색이 업데이트되지 않습니다.

물론 세그먼트 화 된 컨트롤을 두드리는 것이 좋습니다. 그러나, 프로그래밍 방식으로 selectedSegmentIndex을 사용하여 탭을 변경하려고하면 선택 해제 된 탭이 글꼴 색을 업데이트하지 않으므로 레이블이 사라지는 것처럼 보입니다.

tab bar image

내가 탭을 변경하는 방법에 대해 읽은 모든 게시물

프로그래밍 내가 올바른 방법으로하고 있어요 것을 나타냅니다. 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까? 도와 줘서 고마워! 여기

코드입니다 :

class AdvertisingViewController: BaseViewController, TabbedController, ClientSelectorController { 

    var clientSelectorView: ClientSelector? 
    var tabControl: UISegmentedControl! 
    var tabView: UIView! 
    var nextTabIndex: Int? = nil 
    var activeTab: AdvertisingTabContent? = nil 
    var tabs: [AdvertisingTabContent]! 
    let margin: CGFloat = 20 

    override func viewDidLoad() { 
    super.viewDidLoad() 

    // Initialize the tab view. 
    tabView = UIView() 
    view.addSubview(tabView!) 

    // Initialize the tab controls. 
    tabControl = UISegmentedControl() 
    tabControl.insertSegment(withTitle: "Calendar", at: 0, animated: false) 
    tabControl.insertSegment(withTitle: "TV", at: 1, animated: false) 
    tabControl.insertSegment(withTitle: "Radio", at: 2, animated: false) 
    tabControl.insertSegment(withTitle: "Search", at: 3, animated: false) 
    tabControl.insertSegment(withTitle: "Display", at: 4, animated: false) 
    tabControl.selectedSegmentIndex = 0 
    tabControl.addTarget(self, action: #selector(selectedTab(sender:)), for: .valueChanged) 
    view.addSubview(tabControl!) 

    // Tab control styles. 
    let font = UIFont.systemFont(ofSize: 12) 
    tabControl.setTitleTextAttributes([ 
     NSAttributedStringKey.font: font, 
     NSAttributedStringKey.foregroundColor: Color.lightGrey 
    ], for: .normal) 
    tabControl.removeBorders() 

    // Intialize the tabs. 
    nextTabIndex = nil 
    tabs = [ 
     CampaignsTab(view: tabView), 
     TVTab(view: tabView), 
     RadioTab(view: tabView), 
     PaidSearchTab(view: tabView), 
     DisplayTab(view: tabView), 
    ] 

    // Bind clientSelector button to clientSelectButtonPressed method. 
    initializeClientSelector() 

    // Set the background color. 
    tabView.backgroundColor = Color.backgroundColor 
    } 

    override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    // Update client selector title. 
    layoutClientSelector() 

    // Update tab view & segmented control 
    let controlHeight: CGFloat = 35 
    tabControl.frame = CGRect(x: margin, y: clientSelectorView!.frame.height, width: view.frame.width - (margin * 2), height: controlHeight) 

    // Update the tab view. 
    tabView.frame = CGRect(x: 0, y: clientSelectorView!.frame.height + controlHeight + margin, width: view.frame.width, height: view.frame.height - clientSelectorView!.frame.height - controlHeight - margin) 

    // Build tab. 
    buildTab() 
    } 

    override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    // Update the tabControl. 
    if let next = nextTabIndex { 
     if next != tabControl.selectedSegmentIndex { 
     tabControl.selectedSegmentIndex = next 
     } 
     nextTabIndex = nil 
    } 
    } 

    func clientSelectorClicked(selectorModal: UIViewController) { 
    present(selectorModal, animated: true, completion: nil) 
    } 

    // MARK: - Tabs Control 

    /** 
    The user selected a different tab. 
    */ 
    @objc func selectedTab(sender: UIButton) { 
    buildTab() 
    } 

    /** 
    A tab was selected from another part of the app. 
    (This is called before viewWillAppear from another tab) 
    */ 
    func switchToTab(atIndex index: Int) { 
    nextTabIndex = index 
    } 

    func buildTab() { 

    // Clean up the old tab. 
    activeTab?.cleanUp() 
    activeTab = nil 

    // Check next index. 
    var index = tabControl.selectedSegmentIndex 
    if let next = nextTabIndex { 
     index = next 
    } 

    // Add/Build the new tab. 
    if index >= 0 && tabs.count > index { 
     activeTab = tabs[index] 
     activeTab?.buildViews() 
    } 
    } 
} 

업데이트 : 오늘 아침에 솔루션을 찾고

사용 후 몇 시간 이상. 세그먼트 화 된 컨트롤의 하위 뷰에서 레이블을 찾아 수동으로 글꼴 색을 변경하여 해킹을 시도했습니다. 레이블의 텍스트를 변경할 수는 있지만 글꼴 색상은 변경할 수 없습니다. 뭔가가 그것을 무시하고 있습니다.

프로그래밍 방식으로 선택한 인덱스를 변경하는 다른 방법이 있습니까? 사과 티켓을 제출해야합니까? 아무도이 문제가 발생하지 않았습니까? 제공 할 수있는 도움에 미리 감사드립니다.

답변

0

많은 어려움 끝에 결국 대답을 찾았습니다. 나는 다음 포스트에서 방법을 사용하여 국경을 제거 해요 :

Swift: How to remove border from segmented control

extension UISegmentedControl { 
    func applyAppStyles() { 
    setBackgroundImage(imageWithColor(color: Color.contentBackgroundColor), for: .normal, barMetrics: .default) 
    setBackgroundImage(imageWithColor(color: Color.orange), for: .selected, barMetrics: .default) 
    setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) 
    } 

    // create a 1x1 image with this color 
    private func imageWithColor(color: UIColor) -> UIImage { 
    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0) 
    UIGraphicsBeginImageContext(rect.size) 
    let context = UIGraphicsGetCurrentContext() 
    context!.setFillColor(color.cgColor); 
    context!.fill(rect); 
    let image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return image! 
    } 
} 

setBackgroundImage 내 첫 번째 호출이 문제를 일으키는을; 이유가 확실하지 않습니다. 그러나 다음 코드는이를 수정합니다 :

tabControl.setTitleTextAttributes([ 
    NSAttributedStringKey.foregroundColor: Color.darkGreyBlue 
], for: .selected)