iOS 7 UI转换问题:屏幕底部忽略触摸事件
我目前正在修复一个旧应用程序(在iOS 5时代构建)中的一个问题,在这个应用程序中,屏幕底部的按钮触摸事件被忽略。我可以通过创建一个新项目、删除情节提要(以及信息列表中的引用)并在didFinishLaunchingWithOptions中执行以下操作来重新创建此问题(我知道这不是正确的方法,但我正在使用的这个应用程序具有类似的设置) 一旦我运行了这个应用程序,“嘿”按钮只能通过按下它的上半部分来工作。我有一种感觉,它与iOS7状态栏有关,以及用户界面现在是如何在它下面,而不是在它下面。我试着调整窗口的边界,但是没有用。我尝试了各种方法让这个按钮工作,但唯一有效的方法是隐藏状态栏iOS 7 UI转换问题:屏幕底部忽略触摸事件,ios,objective-c,ios7,uikit,uiwindow,Ios,Objective C,Ios7,Uikit,Uiwindow,我目前正在修复一个旧应用程序(在iOS 5时代构建)中的一个问题,在这个应用程序中,屏幕底部的按钮触摸事件被忽略。我可以通过创建一个新项目、删除情节提要(以及信息列表中的引用)并在didFinishLaunchingWithOptions中执行以下操作来重新创建此问题(我知道这不是正确的方法,但我正在使用的这个应用程序具有类似的设置) 一旦我运行了这个应用程序,“嘿”按钮只能通过按下它的上半部分来工作。我有一种感觉,它与iOS7状态栏有关,以及用户界面现在是如何在它下面,而不是在它下面。我试着调
有人知道如何在这种情况下使用该按钮吗?我在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”,使其在横向和纵向中都可见
还为按钮操作添加了一个目标,这是按钮响应所必需的
希望能有帮助 我什么时候测试你的代码?我的模拟器按钮不可见,只显示黄色。因为原因是您的按钮y位置是在可见屏幕之外创建的 您的按钮y值为824.5,但设备尺寸为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;
}
我不认为这些事件被忽略了——我认为只是在iOS7中,按钮按下时没有显示按钮突出显示反馈 使用您的示例,将其添加到AppDelegate.m中的didFinishWithLaunching
[test addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
-(void)buttonPressed:(id)sender{
NSLog(@"hey!");
}
然后将此方法添加到AppDelegate.m
[test addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
-(void)buttonPressed:(id)sender{
NSLog(@"hey!");
}
点击按钮的底部边缘,您将看到调用的操作方法,即使没有显示可见的反馈
奇怪的是,如果您按任意方向拖动,视觉反馈都会正确显示。我已经在测试项目中运行了您的代码。运行此项目后,我没有得到您的按钮,因为它超出了框架。然后我正确地设置帧,然后按钮出现,它接收动作。我怀疑你的按钮出了框,这就是为什么它没有收到动作。请检查视图框,确保按钮位于视图内部,而不是视图外部 “我试图调整窗口的边界” 按钮没有放在你认为应该放的地方。这是不允许的,这就是为什么你不能正确按下它的原因。您只能按视图内的按钮,而不能按视图外的按钮,即使按钮将显示在屏幕上 您可以删除状态栏,除非您需要它 请记住,您应该调整视图内的按钮。 在纸上画这个,画手机,不一定要准确,但你需要知道物体的所有尺寸。在状态栏中绘制,您还有多少空间。如果随后将帧大小设置为大于剩余大小,则将超出范围。 当涉及到按钮时,您应该尝试不使用静态数据进行放置,而是使用视图的大小来确定按钮应该在视图中的位置
- (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];
}
请原谅这些硬编码的值,我正在用一台iPad Mini进行测试,只是想创建一些快速而肮脏的东西。还有最后一件事……这在模拟器上可以正常工作,但在实际设备上却不行……你可能是对的,它与状态栏有关。请阅读,看看它是否有助于您找出如何避免此问题。您能提供您遇到问题的实际绘图代码吗?从你的测试中,除了添加硬编码的框架视图,我真的不知道你在做什么。。。这告诉我的不多,也不适合我。iOS7引入了自动调整大小的遮罩,彻底改变了它们的整个布局方法/结构。我的iOS 6内置应用程序没有正确放置按钮视图,因此,当它们看起来正确时,触摸事件记录在屏幕一半以外的容器中。尝试添加此[测试集翻译自动调整大小GMaskintoConstraints:否]@FelixKhazin-嘿,你检查过自动布局是否打开了吗?这并不能解决问题。将此应用加载到您的设备上。然后尝试单击“嘿”按钮的最底部。你会发现在那里点击是不起作用的。虽然这个按钮确实在iPhone上看不见,但这并不是我的问题所在。拿着你的按钮,把它移动到iPhone的底部边缘。所以设置y=(568-40)。现在单击按钮底部的20个像素。它们不可点击…这就是问题所在。正如我在前面的评论中提到的,只要调整按钮使其位于屏幕底部,您就会注意到按钮的20个像素不可点击。您可以上传您的项目并给我链接,这样我就可以知道发生了什么。您是对的,但是,我如何才能让突出显示的反馈工作?