在 iOS 8 中呈现隐藏键盘时编辑 UIView 的边界 [英] Editing bounds of UIView when presenting hides keyboard in iOS 8

查看:14
本文介绍了在 iOS 8 中呈现隐藏键盘时编辑 UIView 的边界的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我将一个小的登录"UIViewController 呈现为具有自定义边界的 UIModalPresentationFormSheet.在 viewWillLayoutSubviews 方法中,我将视图的大小更改为 (300,250).这在 iOS 5/6/7 中有效,但在 8 中不再有效.

I present a small "login" UIViewController as a UIModalPresentationFormSheet with custom bounds. In the viewWillLayoutSubviews method, I change the size of the view to (300,250). This has worked in iOS 5/6/7 but no longer works in 8.

当视图呈现并点击 UITextField 时,应用程序变得无响应(不冻结,只是不响应触摸).几乎就像键盘出现但没有出现一样.委托方法被正确调用.如果我从 viewWillLayoutSubviews 方法中删除 self.view.superview.bounds = CGRectMake(0, 0, 300, 250); 键盘可以工作,但视图现在是一个全尺寸的 UIModalPresentationFormSheet 样式.

When the view is presented and a UITextField is tapped, the app becomes unresponsive (not frozen, just not responding to touches). Almost as if the keyboard is presented but not appearing. Delegate methods ARE called correctly. If I remove the self.view.superview.bounds = CGRectMake(0, 0, 300, 250); from the viewWillLayoutSubviews method the keyboard works, but the view is now a full sized UIModalPresentationFormSheet style.

这只发生在 iOS 8 中,所以我只能假设它是键盘呈现方式以及我屏蔽/调整视图大小的方式的问题,但我不知道解决方案.

This only happens in iOS 8, so I can only assume its an issue with the way the keyboard is presented and the way I am masking/resizing the view, but I'm at a loss as to the solution.

呈现 ViewController -

Presenting ViewController -

UserLoginViewController *loginVC = [[UserLoginViewController alloc] initWithNibName:@"UserLoginViewController" bundle:nil];
loginVC.modalPresentationStyle = UIModalPresentationFormSheet;
loginVC.delegate = self;
[self presentViewController:loginVC animated:YES completion:nil];

编辑视图边界 -

- (void)viewWillLayoutSubviews {

    [super viewWillLayoutSubviews];
    self.view.superview.layer.cornerRadius  = 10.0;
    self.view.superview.layer.masksToBounds = YES;
    self.view.superview.bounds = CGRectMake(0, 0, 300, 250);
}

推荐答案

在 iOS8 中你不应该在 viewWillLayoutSubviews 中改变 superview 的边界,因为它会导致无限循环.

In iOS8 You shouldn't change superview bounds in viewWillLayoutSubviews because it causes infinite loop.

在 iOS8 属性中,preferredContentSize 效果很好.

in iOS8 property preferredContentSize works well.

您应该以这种方式更改您的代码:

You should change your code in that way:

  UserLoginViewController *loginVC = [[UserLoginViewController alloc] initWithNibName:@"UserLoginViewController" bundle:nil];
    loginVC.modalPresentationStyle = UIModalPresentationFormSheet;
    loginVC.delegate = self;
    if(IS_IOS8)
    {
        loginVC.preferredContentSize = CGSizeMake(300, 250);
    }
    [self presentViewController:loginVC animated:YES completion:nil];

编辑视图边界 -

 - (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    self.view.superview.layer.cornerRadius  = 10.0;
    self.view.superview.layer.masksToBounds = YES;

    if(!IS_IOS8)
    {
        self.view.superview.bounds = CGRectMake(0, 0, 300, 250);
    }
}

另一种为您提供更多自定义选项的方法是使用 UIPresentationController 和 UIViewControllerTransitioningDelegate.看看我下面的代码.

Another way, which gives you more customization options is to use UIPresentationController and UIViewControllerTransitioningDelegate. Take a look at my code below.

父视图控制器:

 _aboutViewController = [[AboutViewController alloc] init];
        _aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet;
        if(IS_IOS8)
        {
            if(aboutTransitioningDelegate == nil)
            {
                aboutTransitioningDelegate = [[AboutTransitioningDelegate alloc] init];
            }
            _aboutViewController.transitioningDelegate = aboutTransitioningDelegate;
            _aboutViewController.modalPresentationStyle = UIModalPresentationCustom;
        }
        [self presentViewController:_aboutViewController animated:YES completion:nil];

AboutViewController.m

AboutViewController.m

#import "AboutViewController.h"

@interface AboutViewController ()

@end

@implementation AboutViewController

- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    if(IS_IOS8)
    {
        return;
    }
    CGSize displaySize = CGSizeMake(320, 462);

    self.view.superview.bounds = CGRectMake(0, 0, displaySize.width, displaySize.height);
}

@end

关于TransitioningDelegate.h:

AboutTransitioningDelegate.h:

@interface AboutTransitioningDelegate : NSObject <UIViewControllerTransitioningDelegate>

@end

关于TransitioningDelegate.m:

AboutTransitioningDelegate.m:

#import "AboutTransitioningDelegate.h"
#import "AboutPresentationController.h"
@implementation AboutTransitioningDelegate

-(UIPresentationController *)presentationControllerForPresentedViewController:(UIViewController *)presented presentingViewController:(UIViewController *)presenting sourceViewController:(UIViewController *)source
{
    return [[AboutPresentationController alloc] initWithPresentedViewController:presented presentingViewController:presenting];
}
@end

关于PresentationController.h

AboutPresentationController.h

#import <UIKit/UIKit.h>

@interface AboutPresentationController : UIPresentationController

@end

关于PresentationController.m

AboutPresentationController.m

#import "AboutPresentationController.h"

@implementation AboutPresentationController


-(CGRect)frameOfPresentedViewInContainerView
{
    CGSize displaySize = CGSizeMake(320, 462);

    if([[Config sharedInstance] latestVersionFromAppstoreInstalled])
    {
        displaySize = CGSizeMake(320, 416);
    }

    CGRect  r =  CGRectZero;
    r.size = displaySize;
    r.origin.y = self.containerView.bounds.size.height/2 - displaySize.height/2;
    r.origin.x = self.containerView.bounds.size.width/2 - displaySize.width/2;
    return r;

}
-(void)containerViewWillLayoutSubviews
{
    [super containerViewWillLayoutSubviews];
    self.presentedView.frame = [self frameOfPresentedViewInContainerView];
}

@end

项目名称-前缀.pch

ProjectName-Prefix.pch

#define IS_IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8)

这篇关于在 iOS 8 中呈现隐藏键盘时编辑 UIView 的边界的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆