作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 UINavigationController 中有一个 UIViewController,它以模态呈现在带有 iOS8 的 iPad 上。我正在使用
self.myNavController.modalPresentationStyle = UIModalPresentationFormSheet;
self.myNavController.view.superview.frame.origin
最佳答案
我们会的,我现在很兴奋。我已经想通了。这可以使用新的 iOS8 UIPresentationController 解决。我将在下面给出一些示例代码。稍后尝试链接到一个工作项目 zip 文件。
第一个 View Controller 是示例应用程序的根 View Controller 。 ChangeFrameTransitioningDelegate 的代码如下。 “Dialog”只是一个空的 View Controller 类。
//
// ViewController.m
// TestPresentationController
//
// Created by Christopher Prince on 9/21/14.
// Copyright (c) 2014 Spastic Muffin, LLC. Use at your own discretion.
//
#import "ViewController.h"
#import "ChangeFrameTransitioningDelegate.h"
#import "Dialog.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void) viewDidAppear:(BOOL)animated;
{
[super viewDidAppear:animated];
ChangeFrameTransitioningDelegate *td = [ChangeFrameTransitioningDelegate new];
td.viewControllerFrame = CGRectMake(100, 0, 100, 100);
Dialog *d = [Dialog new];
// Just to make the VC stand out.
d.view.backgroundColor = [UIColor greenColor];
// Need to make this custom in order to have the presentationControllerForPresentedViewController method of the transitioning delegate called.
d.modalPresentationStyle = UIModalPresentationCustom;
d.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
d.transitioningDelegate = td;
[self presentViewController:d animated:YES completion:^{
// Any time after the view controller is presented you can change the
// viewControllerFrame property to change the size and/or position of the
// presented view controller.
[UIView animateWithDuration:0.5 animations:^{
td.viewControllerFrame = CGRectMake(100, 800, 100, 100);
}];
}];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// ChangeFrameTransitioningDelegate.h
// TestPresentationController
//
// Created by Christopher Prince on 9/21/14.
// Copyright (c) 2014 Spastic Muffin, LLC. Use at your own discretion.
//
// For iOS8 and later, use this to change the size/position of a view controller after it has been presented. See TextPresentationController example.
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface ChangeFrameTransitioningDelegate : NSObject<UIViewControllerTransitioningDelegate>
// This is the size and position that the PresentationController used by this class will use when its frameOfPresentedViewInContainerView method is called. So, this is the size and position that your view controller will have.
@property (nonatomic) CGRect viewControllerFrame;
@end
//
// ChangeFrameTransitioningDelegate.m
// TestPresentationController
//
// Created by Christopher Prince on 9/21/14.
// Copyright (c) 2014 Spastic Muffin, LLC. Use at your own discretion.
//
// Some help from http://stackoverflow.com/questions/25903412/editing-bounds-of-uiview-when-presenting-hides-keyboard-in-ios-8
// http://stackoverflow.com/questions/25811199/ios-8-change-the-size-of-presented-modal-view-controller
// Some code from https://developer.apple.com/devcenter/download.action?path=/wwdc_2014/wwdc_2014_sample_code/lookinsidepresentationcontrollersadaptivityandcustomanimatorobjects.zip (though, beware, this example doesn't work straight out of the box).
// And see http://stackoverflow.com/questions/25957343/moving-a-modally-presented-uiviewcontroller-up-when-keyboard-appears-on-ipad-wit
#ifndef SPASLogDetail
#define SPASLogDetail NSLog
#endif
#import "ChangeFrameTransitioningDelegate.h"
@interface PresentationController : UIPresentationController
{
UIView *_dimmingView;
}
// This is the size and position that the PresentationController will use when its frameOfPresentedViewInContainerView method is called.
@property (nonatomic) CGRect currentFrame;
@end
@implementation PresentationController
- (instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController presentingViewController:(UIViewController *)presentingViewController;
{
self = [super initWithPresentedViewController:presentedViewController presentingViewController:presentingViewController];
// Some random default size.
self.currentFrame = CGRectMake(0, 0, 100, 100);
[self prepareDimmingView];
return self;
}
// 4/22/15; Added, for rotation.
- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator;
{
CGSize increasedSize = size;
// 4/22/15; I'm getting some odd effects: In a rotation transition from landscape to portrait, the RHS goes white momentarily, and from portrait to landscape, the bottom goes white momentarily. A hack, but increase the size of the dimming view to get around this.
increasedSize.width *= 1.5;
increasedSize.height *= 1.5;
_dimmingView.frameSize = increasedSize;
// There appears to be no transitionCoordinator available for this "transition". Therefore using the regular UIView animation, below.
/*
if([self.presentedViewController transitionCoordinator])
{
[[self.presentedViewController transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
recenterViewController();
} completion:nil];
}
else
{
recenterViewController();
}*/
// 4/23/15; See [1]. Given that I've turned off resizing with the autoresizingMask, this has messed up the repositioning of the (x, y) coordinate of the presentedViewController. Make up for that here.
[UIView animateWithDuration: coordinator.transitionDuration animations:^{
// I'm assuming the size here refers to the entire window.
CGPoint center = CGPointMake(size.width/2.0, size.height/2.0);
self.presentedViewController.view.center = center;
} completion:nil];
}
- (void)presentationTransitionWillBegin
{
UIView* containerView = [self containerView];
// 4/23/15; So, this seems to be related to my modal view resizing problem. When I disable autoresizesSubviews, I stop the resizing during the rotation. HOWEVER, this is at the price of two additional problems: (a) the (x, y) coordinate of the modal stops being changed during the rotation, and (b) the animation of the background (_dimmingView?) starts looking funky during the rotation. WHICH makes sense. The containerView size is the full window.
//containerView.autoresizesSubviews = NO;
UIViewController* presentedViewController = [self presentedViewController];
// [1] 4/23/15; This is better. The _dimmingView animation is preserved. The (x, y) position of the presentedViewController, however isn't right after the rotation.
presentedViewController.view.autoresizingMask = UIViewAutoresizingNone;
[_dimmingView setFrame:[containerView bounds]];
[_dimmingView setAlpha:0.0];
[containerView insertSubview:_dimmingView atIndex:0];
void (^setAlpha)() = ^{
[_dimmingView setAlpha:1.0];
};
if([presentedViewController transitionCoordinator])
{
[[presentedViewController transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
setAlpha();
} completion:nil];
}
else
{
setAlpha();
}
}
- (void)dismissalTransitionWillBegin
{
void (^resetAlpha)() = ^{
[_dimmingView setAlpha:0.0];
};
if([[self presentedViewController] transitionCoordinator])
{
[[[self presentedViewController] transitionCoordinator] animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
resetAlpha();
} completion:nil];
}
else
{
resetAlpha();
}
}
- (CGRect)frameOfPresentedViewInContainerView
{
SPASLogDetail(@"frameOfPresentedViewInContainerView: %@", NSStringFromCGRect(self.currentFrame));
return self.currentFrame;
}
- (void) setCurrentFrame:(CGRect)currentFrame
{
_currentFrame = currentFrame;
// This is the important part for changing the frame of the presented view controller *after* the view is presented. For some odd reason, its not right to change the frame of the containerView.
self.presentedView.frame = currentFrame;
}
- (void) containerViewWillLayoutSubviews;
{
SPASLogDetail(@"containerViewWillLayoutSubviews");
}
- (void)prepareDimmingView
{
_dimmingView = [[UIView alloc] init];
[_dimmingView setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.4]];
[_dimmingView setAlpha:0.0];
//UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dimmingViewTapped:)];
//[_dimmingView addGestureRecognizer:tap];
}
/*
- (void)dimmingViewTapped:(UIGestureRecognizer *)gesture
{
if([gesture state] == UIGestureRecognizerStateRecognized)
{
[[self presentingViewController] dismissViewControllerAnimated:YES completion:NULL];
}
}*/
@end
@interface ChangeFrameTransitioningDelegate()
@property (nonatomic, strong) PresentationController *presentationController;
@end
@implementation ChangeFrameTransitioningDelegate
- (instancetype) init;
{
self = [super init];
return self;
}
- (UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source
{
self.presentationController = [[PresentationController alloc] initWithPresentedViewController:presented presentingViewController:presenting];
self.presentationController.currentFrame = self.viewControllerFrame;
return self.presentationController;
}
- (void) setViewControllerFrame:(CGRect)viewControllerFrame
{
_viewControllerFrame = viewControllerFrame;
self.presentationController.currentFrame = viewControllerFrame;
}
@end
关于ipad - 当键盘出现在带有 iOS8 的 iPad 上时,将模态呈现的 UIViewController 向上移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25957343/
我来自 Asp.Net 世界,试图理解 Angular State 的含义。 什么是 Angular 状态?它类似于Asp.Net中的ascx组件吗?是子页面吗?它类似于工作流程状态吗? 我听到很多人
我一直在寻找 3 态拨动开关,但运气不佳。 基本上我需要一个具有以下状态的开关: |开 |不适用 |关 | slider 默认从中间开始,一旦用户向左或向右滑动,就无法回到N/A(未回答)状态。 有人
我是一名优秀的程序员,十分优秀!