设备旋转后的 iOS 按钮点击区域 [英] iOS button tap area after device rotation

查看:25
本文介绍了设备旋转后的 iOS 按钮点击区域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在旋转后遇到几个按钮的问题.在纵向模式下,按钮堆叠在屏幕底部.在横向时,它们会被移动并调整大小以在屏幕底部并排.这一切都很好,按钮行为正确.但是,如果随后将手机旋转回纵向,则按钮的点击区域是错误的 - 只有左侧 1/3 的按钮是可点击的.

I'm having trouble with a couple of buttons after rotation. When in portrait mode, the buttons are stacked at the bottom of the screen. When in landscape, they are moved and resized to be side-by-side at the bottom of the screen. This all works great and the buttons behave correctly. However, if the phone is then rotated back to portrait, the buttons' tap area is wrong - only the left 1/3 of the buttons is tappable.

这是执行旋转的代码.(我也在 viewWillAppear 中调用它,所以它总是在显示视图时执行,以防视图已经处于横向状态.)我已经将按钮放在它们自己的内部视图中.

Here's the code that does the rotation. (I call it within viewWillAppear as well, so it always gets executed when the view is shown, in case the view is already in landscape.) I've put the buttons in their own inner view.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                            duration:(NSTimeInterval)duration {


// determine our dimensions based on orientation
CGRect mainRect = [[UIScreen mainScreen] bounds];
CGFloat maxWidthHeight = MAX(mainRect.size.width, mainRect.size.height);
CGFloat minWidthHeight = MIN(mainRect.size.width, mainRect.size.height);
CGFloat _windowWidth = (UIDeviceOrientationIsPortrait(toInterfaceOrientation)) ? minWidthHeight : maxWidthHeight;


// get the current sizes of the things we are moving
CGRect saveRect = self.viewButtons.frame;
CGRect addLocRect = self.buttonAddLocation.frame;
CGRect connectRect = self.buttonConnect.frame;    

// This will be set below in one of the if-else branches
CGFloat buttonWidth = 0;

// determine the offset from the left/right based on device and orientation
int offset = 0;
if ([self isIphone]) {
    offset = (UIDeviceOrientationIsPortrait(toInterfaceOrientation)) ? OFFSET_LEFT_PORTRAIT_IPHONE : OFFSET_LEFT_LANDSCAPE_IPHONE;
} else {
    offset = (UIDeviceOrientationIsPortrait(toInterfaceOrientation)) ? OFFSET_LEFT_PORTRAIT_IPAD : OFFSET_LEFT_LANDSCAPE_IPAD;
}

// change the size & location of the button frame to just the button height to maximize the area for the location list
// no matter what orientation, the button frame will fill the bottom of the screen
saveRect.size.width = _windowWidth - 2*offset;
saveRect.origin.x = offset;

// for Landscape, move the buttons to side-by-side at the bottom of the window
if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) {

    // size & move the buttons to fit side-by-side
    buttonWidth = (saveRect.size.width)*.4;

    addLocRect.origin.x += offset;
    addLocRect.origin.y = saveRect.size.height - addLocRect.size.height ;

    connectRect.origin.x = saveRect.size.width - buttonWidth - offset;
    connectRect.origin.y = saveRect.size.height - connectRect.size.height;

} else { // Portrait

    // move the buttons down to the bottom of the frame, stacked
    // size the buttons to be fully across the screen
    buttonWidth = saveRect.size.width;

    addLocRect.origin.y = 0 ; // at the top of the button view
    addLocRect.origin.x = 0;
    connectRect.origin.y = saveRect.size.height - connectRect.size.height;
    connectRect.origin.x = 0;

}

connectRect.size.width = buttonWidth;
addLocRect.size.width = buttonWidth;
self.buttonAddLocation.frame = addLocRect;
self.buttonConnect.frame = connectRect;
self.viewButtons.frame = saveRect;
}

我添加了一些日志来确定旋转结束时帧和边界发生了什么:

I added some logging to determine what's going on with the frames and bounds at the end of the rotation:

 NSLog(@"Post rotation:");
 NSLog(@"AddLocation bounds: w=%f, h=%f, x=%f, y=%f", self.buttonAddLocation.frame.size.width, self.buttonAddLocation.frame.size.height,
      self.buttonAddLocation.frame.origin.x, self.buttonAddLocation.frame.origin.y);
 NSLog(@"AddLocation frame: w=%f, h=%f, x=%f, y=%f", self.buttonAddLocation.bounds.size.width, self.buttonAddLocation.bounds.size.height,
      self.buttonAddLocation.bounds.origin.x, self.buttonAddLocation.bounds.origin.y);

 NSLog(@"viewButtons bounds: w=%f, h=%f, x=%f, y=%f", self.viewButtons.frame.size.width, self.viewButtons.frame.size.height,
      self.viewButtons.frame.origin.x, self.viewButtons.frame.origin.y);
 NSLog(@"viewButtons frame: w=%f, h=%f, x=%f, y=%f", self.viewButtons.bounds.size.width, self.viewButtons.bounds.size.height,
      self.viewButtons.bounds.origin.x, self.viewButtons.bounds.origin.y);

结果:

Post rotation: (NOTE: Portrait, initial appearance)
AddLocation bounds: w=272.000000, h=55.000000, x=0.000000, y=0.000000
AddLocation frame: w=272.000000, h=55.000000, x=0.000000, y=0.000000
viewButtons bounds: w=272.000000, h=120.000000, x=24.000000, y=374.000000
viewButtons frame: w=272.000000, h=120.000000, x=0.000000, y=374.000000
Post rotation: (NOTE: rotate to Landscape)
AddLocation bounds: w=217.600006, h=55.000000, x=12.000000, y=65.000000
AddLocation frame: w=217.600006, h=55.000000, x=0.000000, y=0.000000
viewButtons bounds: w=544.000000, h=120.000000,  x=12.000000, y=374.000000
viewButtons frame: w=544.000000, h=120.000000, x=0.000000, y=374.000000
Post rotation: (NOTE: back to Portrait)
AddLocation bounds: w=272.000000, h=55.000000, x=0.000000, y=0.000000
AddLocation frame: w=272.000000, h=55.000000, x=0.000000, y=0.000000
viewButtons bounds: w=272.000000, h=120.000000, x=24.000000, y=138.000000
viewButtons frame: w=272.000000, h=120.000000, x=0.000000, y=374.000000

我看到的从初始到最终的唯一区别是 viewButtons bounds origin.y,但是如果我尝试设置它,事情就会变得一团糟 - 按钮突然出现在屏幕顶部.按钮边界足够宽.

The only difference I see from the initial to final is the viewButtons bounds origin.y, but if I try setting that, things get messed up - the buttons suddenly appear at the top of the screen. The button bounds are wide enough.

我错过了什么?

更新:我错过了这样一个事实,即我在 IB 中为封闭视图设置了支柱和弹簧,这与我设置视图框架的代码相冲突.我删除了设置框架的代码,让 IB 来完成工作,并摆弄按钮的偏移量.不是最漂亮的解决方案,但我需要发布它.

UPDATED: I was missing the fact that I'd set up struts and a spring in IB for the enclosing view, which was fighting with the code I had setting the frame of the view. I removed the code to set the frame, letting IB do the work, and fiddled with the offsets for the buttons. Not the prettiest solution, but I need to release it.

推荐答案

移动按钮不应导致按钮可点击"区域的修改.我认为会导致这种情况发生的唯一原因是:

Moving your buttons shouldn't result in the modification of the "tappable" area of your button. The only reason that I can think that would cause something like this to occur are:

  1. 你有一个透明的视图覆盖你的按钮的一部分回转.如果您确实有透明视图,请制作它们的背景颜色为红色,看看旋转后会发生什么.

  1. You have a transparent view covering parts of your buttons after rotation. If you do have transparent views, make their background color red and see what happens after rotation.

如果您的按钮不是主视图的子项,请打开剪辑Subviews"在xib文件中设置或打开clipsToBounds按钮父视图代码中的属性.如果你的按钮在旋转过程中被剪裁,这可能是您的另一个原因问题.

If your buttons aren't children of the main view, turn on the "Clips Subviews" setting in the xib file or turn on the clipsToBounds property in code of the parent view of the button. If your buttons are clipped during rotation, this could be another reason for your issue.

如果有任何帮助,请告诉我.

Let me know if any of this helps.

这篇关于设备旋转后的 iOS 按钮点击区域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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