1

현재 사용자가 탐색 막대 위에 인스턴스화 된 UISegmentedControl의 세그먼트 화 된 버튼을 선택할 때 슬라이드 애니메이션을 만들고 싶습니다. 현재 저는 6 개의 버튼이있는 UISegmentedControl을 가지고 있습니다.이 버튼은 사용자가 다른보기로 가기 위해 선택할 수 있습니다.UISegmentedControl 뷰 간 슬라이킹

모든 것이 적절하게 작동하지만 슬라이드 전환을 구현하는 데 문제가 있습니다.

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController 
{ 
    int controllerIndex = [[tabBarController viewControllers] indexOfObject:viewController]; 

    if(controllerIndex == self.selectedIndex || self.isAnimating){ 
     return NO; 
    } 

    // Get the views. 
    UIView * fromView = tabBarController.selectedViewController.view; 
    UIView * toView = [viewController view]; 

    // Get the size of the view area. 
    CGRect viewSize = fromView.frame; 
    BOOL scrollRight = controllerIndex > tabBarController.selectedIndex; 

    // Add the to view to the tab bar view. 
    [fromView.superview addSubview:toView]; 

    // Position it off screen. 
    toView.frame = CGRectMake((scrollRight ? 320 : -320), viewSize.origin.y, 320, viewSize.size.height); 

    [UIView animateWithDuration:0.2 animations: ^{ 

     // Animate the views on and off the screen. This will appear to slide. 
     fromView.frame =CGRectMake((scrollRight ? -320 : 320), viewSize.origin.y, 320, viewSize.size.height); 
     toView.frame =CGRectMake(0, viewSize.origin.y, 320, viewSize.size.height); 

    } completion:^(BOOL finished) { 

     if (finished) { 
      // Remove the old view from the tabbar view. 
      [fromView removeFromSuperview]; 
      tabBarController.selectedIndex = controllerIndex; 
     } 
    } 
    ]; 

    return NO; 
} 

하지 동일한 규칙이 여러 viewcontrollers의 UISegmentedControl을 신청하면 그렇게 확신 :

나는이 방법을 사용하여의 UITabBar 뷰 사이에 슬라이드 전환을 구현할 수입니다. 가능한가요? 나는 그것이 있어야한다고 생각하지만 누구든지 시작하는 방법에 대한 아이디어가 있습니까?

편집는 Heres는 내 segmentedcontroller 내에서 사용하는 코드 ...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    /* This bunch of code creates the segmentedControllerButtons in the nav bar */ 
    self.segmentedViewControllers = [self segmentedViewControllerContent]; 

    NSArray * segmentTitles = @[@"Plant", @"Net", @"Wiz", @"Date", @"Clone", @"GF/E"]; 

    self.segmentedControl = [[UISegmentedControl alloc]initWithItems:segmentTitles]; 
    self.segmentedControl.selectedSegmentIndex = 0; 
    self.segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar; 

    [self.segmentedControl addTarget:self action:@selector(didChangeSegmentControl:) forControlEvents:UIControlEventValueChanged]; 

    self.navigationItem.titleView = self.segmentedControl; 
    self.navigationController.navigationBar.tintColor = [UIColor blackColor]; 
    self.segmentedControl.tintColor = [UIColor redColor]; 
    [self didChangeSegmentControl:self.segmentedControl]; // kick everything off 

} 

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

- (NSArray *)segmentedViewControllerContent { 

    CDDConfigPlantViewController *plant = [[CDDConfigPlantViewController alloc] initWithNibName:@"CDDConfigPlantViewController" bundle:nil]; 
    plant->ipAddress = ipAddress; 
    plant->encode = encodedInfo; 
    CDDConfigNetworkViewController *network = [[CDDConfigNetworkViewController alloc] initWithNibName:@"CDDConfigNetworkViewController" bundle:nil]; 
    network->ipAddress = ipAddress; 
    network->encode = encodedInfo; 
    CDDConfigAcquisitionWizardViewController *acquisition_wizard = [[CDDConfigAcquisitionWizardViewController alloc] initWithNibName:@"CDDConfigAcquisitionWizardViewController" bundle:nil]; 
    acquisition_wizard->ipAddress = ipAddress; 
    acquisition_wizard->encode = encodedInfo; 
    CDDConfigDateTimeViewController *date_time = [[CDDConfigDateTimeViewController alloc] initWithNibName:@"CDDConfigDateTimeViewController" bundle:nil]; 
    date_time->ipAddress = ipAddress; 
    date_time->encode = encodedInfo; 
    CDDConfigCDDCloneViewController *cdd_clone = [[CDDConfigCDDCloneViewController alloc] initWithNibName:@"CDDConfigCDDCloneViewController" bundle:nil]; 
    cdd_clone->ipAddress = ipAddress; 
    cdd_clone->encode = encodedInfo; 
    CDDConfigGroundfaultEnergyViewController *groundfault_energy = [[CDDConfigGroundfaultEnergyViewController alloc] initWithNibName:@"CDDConfigGroundfaultEnergyViewController" bundle:nil]; 
    groundfault_energy->ipAddress = ipAddress; 
    groundfault_energy->encode = encodedInfo; 

    NSArray * controllers = [NSArray arrayWithObjects:plant, network, acquisition_wizard, date_time, cdd_clone, groundfault_energy, nil]; 

    return controllers; 
} 



#pragma mark - 
#pragma mark Segment control 

- (void)didChangeSegmentControl:(UISegmentedControl *)control { 
    if (self.activeViewController) { 
     [self.activeViewController viewWillDisappear:NO]; 
     [self.activeViewController.view removeFromSuperview]; 
     [self.activeViewController viewDidDisappear:NO]; 
    } 


    self.activeViewController = [self.segmentedViewControllers objectAtIndex:control.selectedSegmentIndex]; 
    [self.activeViewController viewWillAppear:YES]; 
    [self.view addSubview:self.activeViewController.view]; 
    [self.activeViewController viewDidAppear:YES]; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    [self.activeViewController viewWillAppear:animated]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.activeViewController viewDidAppear:animated]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [self.activeViewController viewWillDisappear:animated]; 
} 

- (void)viewDidDisappear:(BOOL)animated { 
    [super viewDidDisappear:animated]; 
    [self.activeViewController viewDidDisappear:animated]; 
} 

답변

0

은 당신이 애니메이션이나 UIViewControllersUIView입니다. animateWithDuration: animations: completion:UIViewControllerspresentViewController: animated: completion: 경우

작동 UIView 경우

+0

가 편집을 확인 길을 가야하는 것입니다 ...이 모든 viewcontrollers – jsetting32

+0

당신이 내가 이것을 구현하는 것이 방법의 코드 SNIPPIT의 비트를 제공 posibly 수 위의 코드에서 현재 구현 한 내용과 관련하여? 현재 uisegmentedcontrol에 포함 된 uiviewcontrollers 표시하려면 현재 viewWillAppear 및 viewDidAppear 사용하고 있습니다 ... – jsetting32