【问题标题】:Is it possible to Rotate/Affine Transform UIMenuController是否可以旋转/仿射变换 UIMenuController
【发布时间】:2015-09-09 16:18:35
【问题描述】:

没有深入了解这一切的“原因”,我有 UITextField,它是视图层次结构的一部分,它通过仿射变换在屏幕上强制“倒置”。

CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(180))

这适用于所有子视图——包括 UITextField——直到用户想要在文本字段内容上使用 UIMenuController 的复制/粘贴功能。当 UIMenuController 显示时,它是“正面朝上”而不是像 UITextField 那样“倒置”。

是否有把握 UIMenuController 的视图在显示时应用相同的转换?

目前,我正在监听 UIMenuControllerWillShowMenuNotification 通知,然后获取 UIMenuController。但我似乎找不到将转换应用于它的方法。有任何想法吗?

- (void)textFieldDidBeginEditing:(UITextField *)textField {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(menuControllerWillShow:) name:UIMenuControllerWillShowMenuNotification object:nil];

}

- (void)menuControllerWillShow:(NSNotification*)aNotification {

    UIMenuController* menuController = [UIMenuController sharedMenuController];
    CGAffineTransform xform = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(180));

    CGRect oldRect = menuController.menuFrame;
    CGRect newRect = CGRectApplyAffineTransform(oldRect, xform);   

    // eh... now what? 
}

【问题讨论】:

  • 应用中有多少是颠倒的?整个事情还是只是UITextField
  • 几乎是整个事情。该设备始终保持纵向,但由于围绕麦克风位置的各种应用程序要求,我的顶部根视图控制器旋转了(基于用户偏好)180 度。我找到了转换 UIAlertViews、键盘等的方法(当根视图控制器和所有子视图倒置时)。但无法破解 UIMenuController。

标签: ios uimenucontroller


【解决方案1】:

我不认为你可以修改 UIMenuController 所以它是颠倒的。

但是,如果您的整个应用程序几乎都被更改了,您可以检查设备方向或应用程序方向(通过检查状态栏的位置)并强制它相反。

要获得device orientation,您可以执行以下操作:

UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation]

来自文档的注释:

除非已通过调用 beginGeneratingDeviceOrientationNotifications 启用方向通知,否则此属性的值始终返回 0。

或通过以下方式获取应用方向:

UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;

if(orientation == 0) //Default orientation 
{
    //UI is in Default (Portrait) -- this is really a just a failsafe. 
}
else if(orientation == UIInterfaceOrientationPortrait)
{ 
    //Do something if the orientation is in Portrait
}
else if(orientation == UIInterfaceOrientationLandscapeLeft)
{     
   // Do something if Left
}
else if(orientation == UIInterfaceOrientationLandscapeRight)
{    
    //Do something if right
}

然后用这样的东西设置它:

目标-C:

NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];

斯威夫特:

let value = UIInterfaceOrientation.LandscapeLeft.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")

【讨论】:

  • 是的,看起来这应该适合我。但是,我确实必须实现 shouldAutorotate 和supportedInterfaceOrientations。一件奇怪的事:当我设置方向时,shouldAutorotate 并不总是被调用。这意味着它不起作用。但是当我稍微摇晃一下我的设备时……然后 autoRotate 开始被调用。有什么想法吗?
  • 很可能是因为 NavigationController 没有将消息传递给可见的 viewController。您是否在 AppDelegate 中将 Nav 指定为 root 用户?
  • 再想一想,@quaid,请参阅this answer 它可能会解决这个问题。
  • 感谢@CaptJak 的其他想法。然而,在这种情况下,我没有使用UINavigationController,只是一个普通的UIViewController。出于某种原因,我执行[[UIDevice currentDevice] setValue:value forKey:@"orientation"]; 的 UIButton 有时根本不做任何事情,直到我移动我的设备(这显然会强制调用shouldAutorotate。然后一切都很好。玩了之后我发现还有一个额外的调用@ 987654332@ 每次都能正常工作。无论如何,我将此答案标记为正确答案。
  • 好的@quaid,谢谢。很高兴你让它工作,很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多