iOS 7 UI 转换问题:屏幕底部的触摸事件被忽略
Posted
技术标签:
【中文标题】iOS 7 UI 转换问题:屏幕底部的触摸事件被忽略【英文标题】:iOS 7 UI Transition issue: Touch events ignored at bottom of screen 【发布时间】:2014-01-23 19:27:52 【问题描述】:我目前正在修复一个旧应用(内置于 ios 5 时代)中的一个问题,即在屏幕底部忽略按钮触摸事件。我可以通过创建一个新项目、删除情节提要(以及 Info plist 中的引用)并在 didFinishLaunchingWithOptions 中执行以下操作来重新创建此问题(我知道这不是正确的方法,但是这个应用程序我'我正在工作有类似的设置)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
self.window.screen = [UIScreen mainScreen];
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
self.window.rootViewController = vc;
UIButton *test = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[test setTitle:@"Hey" forState:UIControlStateNormal];
[test setBackgroundColor:[UIColor whiteColor]];
test.frame = CGRectMake(0, 824, 200, 200);
[vc.view addSubview:test];
[self.window makeKeyAndVisible];
return YES;
一旦我运行这个应用程序,“嘿”按钮只能通过按下它的上半部分来工作。我感觉它与 iOS 7 状态栏有关,以及 UI 现在如何位于其下方而不是下方。我尝试调整窗口的边界,但这无济于事。我已经尝试了各种方法来让这个按钮工作,但唯一有效的是隐藏状态栏。
任何人都知道如何让该按钮在这种情况下工作?
【问题讨论】:
请原谅硬编码的值,我正在使用 iPad Mini 进行测试,只是想快速创建一些肮脏的东西。 最后一件事......这在模拟器上运行良好,但在实际设备上却不行...... 您可能是对的,它与状态栏有关。请阅读this answer,看看它是否可以帮助您弄清楚如何避免这个问题。 您能否提供您遇到问题的实际绘图代码?从您的测试中,除了添加硬编码的框架视图之外,我真的不知道您在做什么......这并没有告诉我太多,也对我不起作用。 iOS7 引入了 Autoresizing 掩码,真正彻底改变了他们的整个布局方法/结构,我的 iOS 6 构建的应用程序没有正确放置按钮视图,所以当它们看起来正确时,在屏幕一半之外的容器中注册的触摸事件。尝试添加这个 [test setTranslatesAutoresizingMaskIntoConstraints: NO]; @FelixKhazin - 嘿,你检查过自动布局是否打开 【参考方案1】:我不认为这些事件被忽略了 - 我认为这只是在 iOS7 屏幕底部的按钮按下时没有显示按钮突出显示反馈
使用您的示例,将其添加到 AppDelegate.m 中的 didFinishWithLaunching
[test addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
然后将此方法添加到AppDelegate.m中
-(void)buttonPressed:(id)sender
NSLog(@"hey!");
点击按钮的底部边缘,即使没有显示可见反馈,您也会看到调用的操作方法。
奇怪的是,如果您向任何方向按下并拖动,视觉反馈就会正确显示。
【讨论】:
你是对的,但是,我怎样才能让高亮反馈起作用?【参考方案2】:我在 ipad 应用程序中尝试了您的代码,并且“测试”按钮仅在纵向模式下显示。
我使用下面的代码让它以横向显示,并为其操作添加了一个目标。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
self.window.screen = [UIScreen mainScreen];
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
self.window.rootViewController = vc;
UIButton *test = [UIButton buttonWithType:UIButtonTypeRoundedRect];
test.autoresizingMask = UIViewAutoresizingFlexibleTopMargin;
[test setTitle:@"Hey" forState:UIControlStateNormal];
[test addTarget:self action:@selector(testTapped:) forControlEvents:UIControlEventTouchUpInside];
[test setBackgroundColor:[UIColor whiteColor]];
test.frame = CGRectMake(0, 824, 200, 200);
[vc.view addSubview:test];
[self.window makeKeyAndVisible];
return YES;
-(void)testTapped:(id)sender
// the button responder
在这种情况下,需要自动调整大小掩码,因为您为按钮设置了硬编码的帧。我添加了 'UIViewAutoresizingFlexibleTopMargin' 使其在横向和纵向都可见。
还为按钮操作添加了一个目标,这是按钮响应所必需的。
希望对您有所帮助。
【讨论】:
这并不能解决问题。在您的设备上加载此应用程序。然后尝试单击“嘿”按钮的最底部。你会看到点击那里不起作用。【参考方案3】:我什么时候测试你的代码我的模拟器按钮不可见,它只显示黄色。因为原因是您的按钮 y 位置是在可见屏幕之外创建的。
您的按钮 y 值为 824。但设备尺寸为 568(iPhone 4 英寸)。所以你的按钮创建超出当前可见的屏幕边界
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 768, 1024)];
self.window.screen = [UIScreen mainScreen];
UIViewController *vc = [[UIViewController alloc] init];
vc.view.backgroundColor = [UIColor yellowColor];
self.window.rootViewController = vc;
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self
action:@selector(aMethod:)
forControlEvents:UIControlEventTouchDown];
[button setTitle:@"Show View" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[vc.view addSubview:button];
[self.window makeKeyAndVisible];
return YES;
【讨论】:
虽然这个按钮在 iPhone 上是不可见的,但这并不是我的问题所在。拿起您拥有的按钮,并将其向右移动到 iPhone 的底部边缘。所以设置 y=(568-40)。现在单击按钮底部的 20 个像素。它们不可点击……这就是问题所在。【参考方案4】:我已经在测试项目中运行了您的代码。运行这个项目后,我没有得到你的按钮,因为它超出了框架。然后我正确设置框架,然后按钮出现并接收操作。我怀疑您的按钮超出了框架,这就是它没有收到操作的原因。请检查视图框架并确保按钮在视图内,而不是在视图外。
【讨论】:
正如我在之前的 cmets 中提到的,只需调整按钮使其位于屏幕底部,您会注意到按钮的 20 像素不可点击。 能否请您上传您的项目并给我链接,以便我弄清楚发生了什么。【参考方案5】:“我尝试调整窗口的边界”
按钮不在您认为的位置。它超出了界限,这就是为什么你不能正确按下它。您只能按视图内的按钮,而不能按视图外的按钮,即使该按钮将显示在屏幕上。
你可以删除状态栏,除非你想要它...
请记住,您应该调整视图内的按钮。 在纸上画这个,画手机,不一定要准确,但你需要知道物体的所有尺寸。画在状态栏里面,你还剩多少空间。如果然后将帧大小设置为大于剩余大小,它将超出范围。 当涉及到按钮时,您应该尽量不要使用静态数据来放置,而是使用视图的大小来确定按钮应该在视图中的位置。
- (void)applicationDidFinishLaunching:(UIApplication *)application
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// Override point for customization after application launch.
mvc = [[MainViewController alloc]init];
[mvc setTitle:@"Main View"];
UIButton *test = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[test setTitle:@"Hey" forState:UIControlStateNormal];
[test setBackgroundColor:[UIColor whiteColor]];
float buttonHeight = 200;
float buttonWidth = 200;
float statusbarHeight = 20; //can be adjusted to 0 if no statusbar [ 20 | 0 ]
test.frame = CGRectMake(0, mvc.view.frame.size.height-buttonHeight-statusbarHeight , buttonWidth, buttonHeight); //Will adjust with different screen sizes
[mvc.view addSubview:test];
[self.window addSubview:mvc.view];
self.window.rootViewController = mvc;
[self.window makeKeyAndVisible];
【讨论】:
以上是关于iOS 7 UI 转换问题:屏幕底部的触摸事件被忽略的主要内容,如果未能解决你的问题,请参考以下文章