我正在制作一个摄影应用程序,允许以肖像或风景拍摄照片.由于项目的要求,我不能让设备方向自动旋转,但确实需要支持旋转.

使用以下定位方法时:

override func shouldAutorotate() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    if self.orientation == .Landscape {
        return UIInterfaceOrientationMask.LandscapeRight
    } else {
        return UIInterfaceOrientationMask.Portrait
    }
}

override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
    if self.orientation == .Landscape {
        return UIInterfaceOrientation.LandscapeRight
    } else {
        return UIInterfaceOrientation.Portrait
    }
}

我可以在启动时正确设置旋转.通过更改方向值并调用UIViewController.attemptRotationToDeviceOrientation(),我能够支持旋转到新的所需接口.但是,此旋转仅在用户实际移动其设备时发生.我需要它自动发生.

我可以调用:UIDevice.currentDevice().setValue(targetorientation.rawValue,forKey:“orientation”)来强制更改,但这会导致其他副作用,因为UIDevice.currentDevice().orientation只返回从该点开始的setValue上. (而且非常脏)

有什么我想念的吗?我已经研究过关闭并启动一个新的视图控制器,但这有其他问题,例如在解除时立即出现UI故障并立即呈现新的视图控制器.

编辑:

以下方法对我不起作用:

> Trick preferredInterfaceOrientationForPresentation to fire on viewController change
> Forcing UIInterfaceOrientation changes on iPhone

编辑2:

对潜在解决方案的思考

>直接设置方向(使用setValue)并处理iOS 9上出现的所有副作用(不可接受)
>我可以使用当前解决方案并指示用户需要旋转设备.设备物理旋转后,UI会旋转,然后正确锁定到位. (差的UI)
>我可以找到一种强制刷新方向并在没有物理操作的情况下旋转的解决方案. (我在问什么,并寻找)
>手工完成所有工作.我可以纵向或横向锁定界面,并手动旋转和调整容器视图的大小.这是“脏”的,因为它放弃了所有大小类自动布局功能,并导致更重的代码.我试图避免这种情况.

解决方法

我以前遇到过这个问题,我自己.我能够通过简单的解决方法解决它(和 GPUImage).我的代码在Objective-C中,但我确定你将它转换为Swift没有问题.

我首先将项目支持的旋转设置为我希望支持的所有内容,然后覆盖相同的UIViewController方法:

-(BOOL)shouldAutorotate { 
    return TRUE; 
}

-(NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

这允许设备旋转但在纵向模式下将保持不变.然后开始观察设备旋转:

[[NSNotificationCenter defaultCenter] addobserver:self
                                         selector:@selector(adjustForRotation:)
                                             name:UIDeviceOrientationDidChangeNotification
                                           object:nil];

如果设备处于纵向模式或横向,则更新UI:

-(void)adjustForRotation:(NSNotification*)notification
{
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    switch (orientation) {
        case UIDeviceOrientationLandscapeLeft:
        {
            // UPDATE UI
        }
            break;
        case UIDeviceOrientationLandscapeRight:
        {
            // UPDATE UI
        }
            break;
        default: // All other orientations - Portrait,Upside Down,UnkNown
        {
            // UPDATE UI
        }
            break;
    }
}

最后,GPUImage根据设备的方向渲染图像.

[_gpuImageStillCamera capturePhotoAsImageProcessedUpToFilter:last_f
                                              withCompletionHandler:^(UIImage *processedImage,NSError *error) { 
    // Process the processedImage 
}];

iOS 9中的强制视图控制器方向的更多相关文章

  1. ios – 在sendEvent方法上崩溃

    当我在选择几个项目后旋转应用程序两次时,它会崩溃.我重写了sendEvent方法,这是调试器停止的地方.当我尝试打印事件类型时,它会向我显示一些奇怪的东西(我认为这是一个不存在的内存位置):不知何故,我认为这与我如何处理轮换有关.我有一个主–细节风格的应用程序,它使用不同类型的导航来拍摄风景,拍摄肖像和手机.我创建了一个名为NavigationFlowController的类,它处理所有导航事件并

  2. ios – UIDeviceOrientation ipad

    我有以下代码根据方向填充视图.这总是会返回景观.我正确地改变了视图–(void)animateRotation:(UIInterfaceOrientation)interfaceOrientation持续时间:(NSTimeInterval)持续时间{但是在更改播放列表时已经在横向或纵向中不起作用.解决方法而不是使用[[UIDevicecurrentDevice]orientation]来检查方向

  3. iOS 9中的强制视图控制器方向

    我正在制作一个摄影应用程序,允许以肖像或风景拍摄照片.由于项目的要求,我不能让设备方向自动旋转,但确实需要支持旋转.使用以下定位方法时:我可以在启动时正确设置旋转.通过更改方向值并调用UIViewController.attemptRotationToDeviceOrientation(),我能够支持旋转到新的所需接口.但是,此旋转仅在用户实际移动其设备时发生.我需要它自动发生.我可以调用:UID

  4. 小胖说swift11-------- ios 进入某个VC强转为横屏,出VC后复原

    今天做项目,某一个VC需要展现VR展览内容,产品要求这个VC可以横屏查看,因为横屏查看的时候,看的范围比较大,但是其余的VC都是竖屏显示的,为了达到某个VC横屏显示其余VC不变的效果,然后查询资料,撸代码。。

  5. 只有在Swift中,如何将一个视图控制器的方向锁定到纵向模式

    由于我的应用程序支持所有方向.我想只将肖像模式锁定到特定的UIViewController.(e.g.AssumeitwasTabbedApplicationandwhenSignInViewappearmodally,IonlywantthatSignInViewtotheportraitmodeonlynomatterhowtheuserrotatethedeviceorhowthecurre

  6. 错误:screenSize | smallestScreenSize android studio Target SDK 23

    我正在尝试将heyZap广告集成到我的应用中,但我在构建时遇到此错误:错误:screenSize|smallestScreenSize).我搜索了它,我发现它的目标sdk错误应该至少为13但是在这里我使用的是SDK23.这是我的清单文件:这是我的build.gradle文件:这是错误的图片:这是我一直关注的链接:https://developers.heyzap.com/docs/android_

  7. Android ImageView按重量调整大小,不以父LinearLayout为中心

    理想情况下,我可以设置“重力”,或者设置宽度而不需要水平LinearLayout容器和重量的一些替代方法,因为没有那个容器我可以居中在我的顶级垂直LinearLayout中水平放置.谢谢!

  8. android – 保存数据并更改方向

    我有两个活动,我使用android:configChanges=“keyboardHidden|orientation|screenSize”一个主动用于纵向到第二个横向但是当方向发生变化时,会加载活动并丢失数据如何保存数据并更改活动方向?

  9. 在指定横向时,如何防止Android Activity暂时进入纵向模式?

    我怀疑这与应用程序在从纵向屏幕启动时自动旋转的事实有关.似乎奇怪的是,应用程序已被指示永远不会以纵向方式开始,然后快速更改.但是,有没有办法让它永远不会成像?我把它放在我的Activity’sonCreate中:这导致它永远卡在那里:)解决方法将此添加到您的活动中:

  10. android – 为什么我的Button的文字会被截断?

    我有一个正常的按钮,但是文字被截断了.我不知道为什么会这样.有谁可以分析它为什么会发生?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部