如何添加滑入式视图效果?

时间:2015-02-12 17:22:03

标签: objective-c uiview uiviewcontroller uiviewanimationtransition

如何从底部视图效果创建这个简单的幻灯片?

enter image description here *

我有一个动作表方法,我想创建这个视图控制器效果,当我点击其中一个动作表按钮时,我将从屏幕底部滑入此视图,我不需要你解释对我来说如何添加日期选择器,只有滑动时视图的效果和背景在滑动时更暗,当它被解除时获得升

请帮我这样做:))

这是我的动作表方法,我想执行此操作(而不是模态):

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {

    if (buttonIndex == 0) {
        NSLog(@"first button was pressed");
    } else if (buttonIndex == 1) {
        MyViewController *myViewController = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];
        UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:myViewController];
        [self.navigationController presentViewController:navigationController animated:YES completion:nil];
    }
}

1 个答案:

答案 0 :(得分:0)

这是一种自动布局方式:

  1. 使用深色透明背景创建“封面视图”并约束它以填充窗口。将其插入所有其他视图之上。
  2. 创建包含日期选择器的视图,并将其添加到封面视图上方的窗口,窗口底部有一个顶部约束。
  3. 在日期选择器视图上调用layoutIfNeeded()以触发自动布局。现在,视图位于屏幕“下方”,用户尚不可见。
  4. 删除顶部约束并在窗口底部添加底部约束。
  5. 在动画块内再次调用layoutIfNeeded(),视图将从屏幕底部向上滑动到其最终位置。您也可以淡入动画块中的封面视图。
  6. 这是一个简单的例子。我没有测试过这个确切的代码,但是我已经多次做过这种事了,你应该能够从这种方法中得到一些我希望的东西!请注意,这假设MyActionSheet具有有效intrinsicContentSize

    // Create cover view
    coverView = [UIView new];
    coverView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.4];
    coverView.alpha = 0.0;
    
    // Add to window
    [window addSubview:coverView];
    [window bringSubviewToFront:coverView];
    
    // Pin to edges
    [window addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[coverView]|" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(coverView)]];
    [window addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[coverView]|" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(coverView)]];
    
    // Create action sheet
    MyActionSheet *sheet = [MyActionSheet new];
    [window insertSubview:sheet aboveSubview:coverView];
    
    // Add horizontal constraints
    [window addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[sheet]|" options:kNilOptions metrics:nil views:NSDictionaryOfVariableBindings(sheet)]];
    
    // Pin to starting position
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:sheet attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:window attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
    [window addConstraint:topConstraint];
    
    // Layout to start
    [sheet layoutIfNeeded];
    
    // Pin to final position
    [window removeConstraint:topConstraint];
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:sheet attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:window attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
    [window addConstraint:bottomConstraint];
    
    // Animate to final position
    [UIView animateWithDuration:0.3 animations:^{
        coverView.alpha = 1.0;
        [sheet layoutIfNeeded];
    }];
    

    如果由于某种原因不想使用自动布局,可以手动调整视图的帧,前提是可以计算操作表的高度。