在UISegmentedControl视图之间滑动

时间:2013-07-22 23:51:12

标签: ios objective-c uiview uiviewcontroller uisegmentedcontrol

目前,当用户选择在导航栏顶部实例化的UISegmentedControl的分段按钮时,我想要创建幻灯片动画。目前我有一个带有6个按钮的UISegmentedControl,用户可以按下并选择转到不同的视图。

一切都有效,但是如果可能的话,我在实现幻灯片转换方面遇到了问题。

我可以使用此方法在UITabBar视图之间实现幻灯片转换:

- (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。这可能吗?我认为它应该是,但任何人对如何开始有任何想法?

编辑

继承我在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];
}

1 个答案:

答案 0 :(得分:0)

您要动画UIView还是UIViewControllers

如果UIView工作animateWithDuration: animations: completion:

如果UIViewControllers presentViewController: animated: completion:是要走的路