문제

나는 UiseGmentedControl의 다른 상태를 사용하여 뷰 스토어에서 'Top Pay'와 'Top Free'사이를 휘두를 때 Apple이 앱 스토어에서 수행하는 방식과 유사하게 뷰를 전환하는 방법을 알아 내려고 노력하고 있습니다.

도움이 되었습니까?

해결책

가장 간단한 접근법은 가시성을 전환하여 어떤 뷰가 선택되었는지 표시 할 수있는 두 가지보기를 갖는 것입니다. 다음은 뷰를 처리 할 수있는 최적화 된 방법이 아니라 사용 방법을 보여주기 위해 수행 할 수있는 방법에 대한 샘플 코드입니다. uisegmentcontrol 눈에 보이는보기를 전환하려면 :

- (IBAction)segmentSwitch:(id)sender {
  UISegmentedControl *segmentedControl = (UISegmentedControl *) sender;
  NSInteger selectedSegment = segmentedControl.selectedSegmentIndex;

  if (selectedSegment == 0) {
    //toggle the correct view to be visible
    [firstView setHidden:NO];
    [secondView setHidden:YES];
  }
  else{
    //toggle the correct view to be visible
    [firstView setHidden:YES];
    [secondView setHidden:NO];
  }
}


물론 올바른보기를 숨기거나 표시하도록 코드를 다시 수익 할 수 있습니다.

다른 팁

내 경우 내 견해는 상당히 복잡하며 다른 견해의 숨겨진 속성을 너무 많은 메모리를 차지할 수 있기 때문에 변경할 수는 없습니다.

나는 몇 가지 솔루션을 시도했지만 그들 중 비는 저를 위해 일했거나, 특히 Navbar의 Titleview와 함께 뷰를 푸시/팝핑 할 때 항상 세그먼트로드 콘트롤을 보여주지는 않습니다.

올바른 방식으로 수행하는 방법을 설명하는 문제에 대한 블로그 게시물을 찾았습니다. WWDC'2010에서 애플 엔지니어의 도움을 받아이 솔루션을 제시 할 수있는 것 같습니다.

http://redartisan.com/2010/6/27/uisegmented-control-view-switching-revisited

이 링크의 솔루션은 지금까지 문제에 대해 내가 찾은 최상의 솔루션입니다. 약간의 조정으로 바닥의 탭 바와 함께 잘 작동했습니다.

또는 테이블이라면 테이블을 다시로드 할 수 있으며 CellforseAtIndex에서 선택한 세그먼트 옵션을 기반으로 다른 데이터 소스에서 테이블을 채울 수 있습니다.

한 가지 아이디어는 세그먼트 컨트롤과 함께보기에 다른 서브 뷰로 채우는 컨테이너 뷰를 갖는 것입니다 (세그먼트가 전환 될 때 컨테이너 뷰의 유일한 서브 뷰로 추가). "ViewWillAppear"및 "ViewWillDisAppear"와 같은 중요한 방법을 필요로하는 경우 (그리고 그들이 어떤 탐색 컨트롤러인지 알려야 함) "ViewWillAppear"및 "ViewWillDisAppear"와 같은 중요한 방법을 전달해야하지만 해당 하위 뷰에 대해 별도의 뷰 컨트롤러를 가질 수 있습니다.

일반적으로 IB의 컨테이너를 사용하여 기본보기를 배치 할 수 있기 때문에 꽤 잘 작동하며, 하위 뷰는 컨테이너가 가지고있는 공간을 채우게됩니다 (자동 제품 크기 마스크가 제대로 설정되어 있는지 확인하십시오).

이 코드를 시도하면 세그먼트 제어의 변화하는 세그먼트에 대한 다른 뷰를 전환하는 데 도움이됩니다.

UiseGmentControl의 다른 세그먼트를 선택할 때 다른 뷰를 엽니 다

사용해보십시오 SNFSegmentedViewController, 당신이 찾고있는 것과 같은 설정을 정확하게 수행하는 오픈 소스 구성 요소 UITabBarController.

@ronnie liew의 답변에서 나는 이것을 만듭니다.

//
//  ViewController.m
//  ResearchSegmentedView
//
//  Created by Ta Quoc Viet on 5/1/14.
//  Copyright (c) 2014 Ta Quoc Viet. All rights reserved.
//
#define SIZE_OF_SEGMENT 56
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize theSegmentControl;
UIView *firstView;
UIView *secondView;
CGRect leftRect;
CGRect centerRect;
CGRect rightRect;
- (void)viewDidLoad
{
    [super viewDidLoad];
    leftRect = CGRectMake(-self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    centerRect = CGRectMake(0, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);
    rightRect = CGRectMake(self.view.frame.size.width, SIZE_OF_SEGMENT, self.view.frame.size.width, self.view.frame.size.height-SIZE_OF_SEGMENT);

    firstView = [[UIView alloc] initWithFrame:centerRect];
    [firstView setBackgroundColor:[UIColor orangeColor]];
    secondView = [[UIView alloc] initWithFrame:rightRect];
    [secondView setBackgroundColor:[UIColor greenColor]];
    [self.view addSubview:firstView];
    [self.view addSubview:secondView];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)segmentSwitch:(UISegmentedControl*)sender {
    NSInteger selectedSegment = sender.selectedSegmentIndex;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.2];
    if (selectedSegment == 0) {
        //toggle the correct view to be visible
        firstView.frame = centerRect;
        secondView.frame = rightRect;
    }
    else{
        //toggle the correct view to be visible
        firstView.frame = leftRect;
        secondView.frame = centerRect;
    }
    [UIView commitAnimations];
}
@end

.h를 할당하십시오

 UISegmentedControl *lblSegChange;

- (IBAction)segValChange:(UISegmentedControl *) sender

.m

- (IBAction)segValChange:(UISegmentedControl *) sender
{

 if(sender.selectedSegmentIndex==0)
 {
  viewcontroller1 *View=[[viewcontroller alloc]init];
  [self.navigationController pushViewController:view animated:YES];
 }
 else 
 {
  viewcontroller2 *View2=[[viewcontroller2 alloc]init];
  [self.navigationController pushViewController:view2 animated:YES];
 }
} 

스위프트 버전 :

부모보기 컨트롤러는 각 어린이보기 컨트롤러의보기의 크기와 위치를 설정해야합니다. Child View Controller의보기는 Parent View Controller의 View 계층의 일부가됩니다.

게으른 속성 정의 :

private lazy var summaryViewController: SummaryViewController = {
   // Load Storyboard
   let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

   // Instantiate View Controller
   var viewController = storyboard.instantiateViewController(withIdentifier: "SummaryViewController") as! SummaryViewController

   // Add View Controller as Child View Controller
   self.add(asChildViewController: viewController)

   return viewController
}()

private lazy var sessionsViewController: SessionsViewController = {
    // Load Storyboard
    let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)

    // Instantiate View Controller
    var viewController = storyboard.instantiateViewController(withIdentifier: "SessionsViewController") as! SessionsViewController

    // Add View Controller as Child View Controller
    self.add(asChildViewController: viewController)

    return viewController
}()

자식보기 컨트롤러 표시/숨기기 :

private func add(asChildViewController viewController: UIViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    view.addSubview(viewController.view)

    // Configure Child View
    viewController.view.frame = view.bounds
    viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UIViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

세그먼트 조정 테이프를 관리합니다

private func updateView() {
    if segmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: sessionsViewController)
        add(asChildViewController: summaryViewController)
    } else {
        remove(asChildViewController: summaryViewController)
        add(asChildViewController: sessionsViewController)
    }
}

물론 자녀보기 컨트롤러 클래스 내에서 사용할 수 있습니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("Summary View Controller Will Appear")
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    print("Summary View Controller Will Disappear")
}

참조:https://cocoacasts.com/managing-view-controllers-with-container-view-controllers/

빠른 신속한 버전 :

@IBAction func segmentControlValueChanged(_ sender: UISegmentedControl) {

    if segmentControl.selectedSegmentIndex == 0 {

        // do something
    } else {

        // do something else
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top