在 iOS8 下使用 CGAffineTransform 旋转时 UIView 不调整大小

2023-11-30

我有一个 UIViewController,当设备旋转时,它只旋转其中的一些子视图。这在 iOS7 下工作正常,但在 iOS8 下就崩溃了。看起来UIView的边界是通过iOS8下的变换来调整的。这是出乎意料的。

这是一些代码:

@interface VVViewController ()
@property (weak, nonatomic) IBOutlet UIView *pinnedControls;
@property (nonatomic, strong) NSMutableArray *pinnedViews;

@end

@implementation VVViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.pinnedViews = [NSMutableArray array];
    [self.pinnedViews addObject:self.pinnedControls];
}

-(void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];

    [UIViewController rotatePinnedViews:self.pinnedViews forOrientation:self.interfaceOrientation];
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

    if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation) && UIInterfaceOrientationIsLandscape(self.interfaceOrientation))  {
        [UIViewController rotatePinnedViews:self.pinnedViews forOrientation:toInterfaceOrientation];
    }
}

@end

我们在 UIViewController 上创建了一个类别来处理此行为。这是相关代码:

@implementation UIViewController (VVSupport)

+ (void)rotatePinnedViews:(NSArray *)views forOrientation:(UIInterfaceOrientation)orientation {
    const CGAffineTransform t1 = [UIViewController pinnedViewTansformForOrientation:orientation counter:YES];
    const CGAffineTransform t2 = [UIViewController pinnedViewTansformForOrientation:orientation counter:NO];
    [views enumerateObjectsUsingBlock:^(UIView *view, NSUInteger idx, BOOL *stop) {
        // Rotate the view controller
        view.transform = t1;
        [view.subviews enumerateObjectsUsingBlock:^(UIView *counterView, NSUInteger idx, BOOL *stop) {
            // Counter-rotate the controlsUIin the view controller
            counterView.transform = t2;
        }];
    }];
}

+ (CGAffineTransform)pinnedViewTansformForOrientation:(UIInterfaceOrientation)orientation counter:(BOOL)counter {
    CGAffineTransform t;
    switch ( orientation ) {
        case UIInterfaceOrientationPortrait:
        case UIInterfaceOrientationPortraitUpsideDown:
            t = CGAffineTransformIdentity;
            break;

        case UIInterfaceOrientationLandscapeLeft:
            t = CGAffineTransformMakeRotation(counter ? M_PI_2 : -M_PI_2);
            break;

        case UIInterfaceOrientationLandscapeRight:
            t = CGAffineTransformMakeRotation(counter ? -M_PI_2 : M_PI_2);
            break;
    }

    return t;
}

@end

这是笔尖的样子:

enter image description here

nib 中名为 pinned 的 UIView 是 pinnedControls 的 IBOutlet:

当我在 iOS7 或 iOS8 下以纵向模式运行此程序时,我得到以下信息:

enter image description here

我在 iOS7 的横向模式下看到了预期的结果:

enter image description here

但在 iOS8 (GM) 下我没有得到这种行为。这是我看到的:

enter image description here

请注意,带有文本“固定标签”的 UILabel 的中心与固定 UIView 的底部保持距离,该 UIView 没有更改大小以适应旋转。该 UIView 的所有边缘都固定在超级视图的顶部、左侧、底部和右侧。

在我看来,在 iOS8 下,transform 属性与自动布局的交互方式有所不同。我在这里有点困惑。我知道我不能依赖框架。我可能只是开始手动设置边界,但这似乎是错误的做法,本质上是围绕自动布局进行结束运行。


所以过去几天这让我发疯,我可以通过更改动画块中 setTransform 调用的时间来解决

当转到风景时,我在设置新框架后设置变换。当进行肖像拍摄时,我会在设置新框架之前设置变换。所有这些都发生在“animateWithDuration...”方法的动画块内

我不确定它是否会直接帮助您处理代码,但它可能会激发一些解决它的灵感,因为我们肯定遇到了类似的问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iOS8 下使用 CGAffineTransform 旋转时 UIView 不调整大小 的相关文章

  • SKLightNode 无法在真实设备上工作 [iPhone 5]

    我建立了一个简约的项目here http override apps com wp content uploads iOS8 Test zip它只是添加一个红色方块 然后点击屏幕后 一个光源照亮它 在模拟器上它运行良好 但在我的 iPhon
  • 如何使用文档提供者扩展?

    我正在学习更多有关 ios 扩展的知识 例如 今日扩展 照片编辑扩展 动作延伸 自定义键盘扩展 在所有这些中 我在学习上没有困难 但最近我尝试学习 文档提供程序扩展 令我惊讶的是 在互联网上没有找到任何相关教程谈论如何使用它 与其他人一样一
  • iOS 8 单元格大小调整

    我有一个子类UITableViewCell我覆盖setFrame 向单元格添加插图 在 iOS 7 中 一切似乎都工作正常 而在 iOS 8 上 表视图正确加载单元格 但当我刷新表视图时 单元格的大小会调整 通过注释中的代码setFrame
  • 如何相对于包含视图大小定位子视图?

    我希望能够将我的子视图从顶部定位到超级视图大小的 25 NSLayoutConstraint topPositionConstraint NSLayoutConstraint constraintWithItem containerView
  • 搜索栏与节标题视图重叠

    我将搜索栏放在 tableHeaderView 内 在 iphone 6 上一切正常 但在 iphone 5s 上我得到这个奇怪的结果 override func viewDidLoad super viewDidLoad tableVie
  • iOS8 + Apple 的 KeychainItemWrapper 导致崩溃

    我一直在苹果论坛上挖掘这个问题 但没有成功 使用Apple的KeychainItemWrapper ARCified 尝试设置kSecAttrAccessible属性除默认值 kSecAttrAccessibleWhenUnlocked 导
  • 如何使自定义键盘扩展再次成为第一响应者

    我正在制作一个自定义键盘扩展 在这个键盘中 我有另一个 uitextfield 作为搜索字段 因此当我在自定义键盘上键入时 我不会将文本发送到 safari 的文本字段或某些聊天应用程序的文本字段 而是发送将文本发送到自定义键盘中的 uit
  • iPad 的自适应布局

    我正在关注这篇文章在 ios 中构建自适应布局为 iOS 8 构建自适应用户界面 http www sitepoint com building adaptive user interfaces ios 8 它在 iPhone 上运行良好
  • iOS 8.0 中的 UISearchBar barTintColor clearColor 错误

    在我的应用程序中我正在使用UISearchBar在 xib 与Xcode6 我给的条形锡颜色是透明颜色 它正在努力iOS 7 1 below 但主要问题在于iOS 8 0它的颜色不清晰 它显示黑色 看图片 任何对这个问题有冒险精神的人 我在
  • 8.0 之前的 iOS 版本上相对于布局边距的布局属性

    什么会导致以下警告 以及 iOS 7 上的后续对齐问题 属性不可用 8 0 之前的 iOS 版本上与布局边距相关的布局属性 发布的答案都没有为我解决问题 但其原因如下 默认情况下 Xcode 6 根据相对边距创建约束 这些仅适用于 iOS
  • 为什么UICollectionViewCell的outlet为nil?

    我在 Interface Builder 中创建了一个自定义 UICollectionViewCell 将其上的视图绑定到类 然后当我想使用字符串并将其设置为字符串上的标签时 该标签具有 nil 值 override func viewDi
  • 延迟推送通知并检查用户是否启用它

    我开发了一个应用程序 它围绕推送通知构建 仅当用户达到注册过程的某个阶段时 应用程序才会请求通知权限 我已经设法做到了以下几点 该应用程序维护一个NSUserDefaults变量 指示是否需要在启动时注册推送 默认情况 不需要 当注册达到该
  • CloudKit 通过 cron 作业发送推送通知?

    我正在创建一个大学餐饮菜单应用程序 在其中我需要根据每日菜单发送推送通知 最初 我计划通过 Heroku 将用户数据存储在数据库中 并使用 cron 作业将数据库中的数据与每日菜单进行比较 并向用户发送适当的通知 然而 在 Cloudkit
  • 我如何从子视图导航到 mainviewcontroller

    我刚刚开始使用 swift 我创建了一个子视图 上面有一个按钮 我想使用该按钮将我带到我的主视图控制器 我对不同的按钮使用了相同的功能 但是在同一文件中具有一个功能允许该按钮工作 代码如下 var playAgainButton UIBut
  • ios水平居中约束问题?

    I am having hard time in learning constraints auto layout in iOS I have used any width any height I have a storyboard sc
  • 无法以编程方式快速设置 NSLayoutConstraint 乘数...“无法分配给此表达式的结果

    我试图以编程方式快速设置乘法器的约束 当我设置该值时 它只会给我错误 无法分配给该表达式的结果 我用 IBOutlet 声明了 NSLayoutConstraint 然后设置乘数 就像我对另一个常量所做的那样 效果很好 但这个不会接受它 I
  • UIView 的变换看起来很糟糕

    我有一个简单的视图和简单的背景 我需要旋转视图及其内容 代码在这里 CGAffineTransform r CGAffineTransformMakeRotation 5 M PI 180 0f backView transform r 我
  • 视图水平和垂直不明确且布局复杂

    我有一个UIViewController在我的故事板上有 2 个水平并排的子视图 我添加了约束来将前缘和后缘固定为常数 20 点 并添加了另一个约束来保持宽度相等 如果我假设以下内容 应该可以计算每个子视图需要的宽度 子视图不重叠 不存在其
  • 解雇ViewControllerAnimated:完成:在 iOS 8 上

    在 iOS dismissViewControllerAnimated completion 会导致presentedViewController being nil 在 iOS 8 中 presentedViewController仍然指
  • iOS8中如何在UIAlertController中添加UITableview?

    Till iOS7 in Custom view we can put tableview in alert as per below picture But in iOS8 UITableview is not working I can

随机推荐

  • 如何在 ruby​​ 中对字母数字数组进行排序

    如何在 ruby 中按字母数字顺序对数组数据进行排序 假设我的数组是a test 0 1 test 0 2 test 0 3 test 0 4 test 0 5 test 0 6 test 0 7 test 0 8 test 0 9 tes
  • Android Studio 未在 Flutter 中显示 Logcat

    我正在使用 Android StudioFlutter应用程序开发 一切似乎都工作正常 只是 Android Studio 没有在 Logcat 中显示 日志 在 Logcat 部分中 显示 请配置 Android SDK 这是已经配置好的
  • 从数据表中清除排序 stateSave

    我有带有状态保存和标头过滤器的数据表 请参阅下面的代码 dttblEnrolledUser tblUsers dataTable paging true searching true bLengthChange false info fal
  • 将对象添加到 json 文件 - Node.js

    我正在尝试将一个对象添加到 Node js 中一个非常大的 JSON 文件中 但前提是 id 与现有对象不匹配 到目前为止我所拥有的 JSON 文件示例 id 123 text some text id 223 text some othe
  • 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?

    我正在尝试提取可执行文件的文件描述 文件描述是当您右键单击文件并选择 属性 时看到的 它位于 常规 选项卡中 我尝试过使用这里找到的算法 https learn microsoft com en us windows desktop api
  • 从 php codeigniter 调用存储过程

    找了一个星期 没有找到一些可以用来执行存储过程的内容 设想 我已经在Profiler窗口中复制了在SQL Server 2014管理上运行的代码 我打开 SQL Studio 和 HeidiSQL 并运行查询 它运行正常并返回预期结果 当我
  • 如何将裁剪后的图像扩展为方框?

    我得到了一张 JPEG 图像 需要使用 CSS 对其进行裁剪 然后进行扩展以适合1200px x 1000px box 这是我到目前为止所拥有的 top image display block clip path inset 0px 103
  • 启用通知/观看 Google Play 存储桶以编程方式下载报告

    有很多关于的新信息如何以编程方式下载 Google Play 报告 using gsutil工具 Google Play 使用存储桶来存储这些报告 就像 Google Cloud Storage 一样 我已经能够毫无问题地从 Google
  • 当我同时将 spring boot 应用程序配置为 eureka 服务器和客户端时出错

    我正在开发一个 Spring Boot 应用程序 我希望它同时成为尤里卡服务器和尤里卡客户端 以实现我修改的目标application properties file server port 8761 eureka client regis
  • 如何在jtable中的图像旁边添加文本?

    我有一个三列 jtable 希望前两列有一个图像图标和一个紧挨着它的字符串 目前我正在显示像这样的 ImageIcons DefaultTableModel model new DefaultTableModel rows columns
  • PHP:仅允许字符串中的某些字符,而不使用正则表达式

    我只想允许字符串中包含某些字符 我知道这很容易预匹配但这个功能我多年来一直无法理解 正如我所说 我看到了数百万个 preg match 示例 但我想构建我的示例 我只想允许 1 所有大写 小写英文字母和数字 abcdefghijklmnop
  • 如何计算R中2行的值频率

    我有一张这样的桌子 Menu name Transcode Menu 1 a1 Menu 2 a2 Menu 3 a3 Menu 1 a1 Menu 3 a2 Menu 1 a1 Menu 1 a3 如何在 R 中实现此枢轴以计算 x 列
  • 利用浏览器缓存

    我有一个网站 当我使用 Google 插件检查页面速度时 我收到 利用浏览器缓存以下资源缺少缓存过期时间 搜索仅返回有关在 Apache 下使用 htaccess 的信息 但我的站点在 Windows 2003 Server 上以纯 HTM
  • URL.getHost() 的解析结果

    需要帮助解析 在我的代码中 我有一个返回 url getHost 的方法 但结果可能是 blarg com 有时也可能是dates blarg com 对于任何一种情况 或对于 xxx yyy ggg blarg com 我都想返回 bla
  • Android - 如何从 Firebase 检索按插入顺序排列的对象列表?

    我想要什么 我想从 Firebase 数据库中检索按插入顺序排列的对象列表 如何将对象添加到 Firebase 数据库中的列表 mRefUser push setValue new MessageItem mRefUser push set
  • 键盘上的 QuickType 栏

    大家可能都知道键盘上新的快速输入栏 在我的应用程序中 我在键盘上放置了一个自定义 TextView 栏 但因为快速输入栏 我的文本视图被隐藏了 我想知道 是否有任何属性或方法可以知道 QuickType Bar 是否打开 没有任何信息可以告
  • jsf页面和托管bean之间,为什么getter方法被调用两次

    我有一个 jsf 页面 其中的表单有一个输出文本 Outputtext 组件的值是从支持 bean 或托管 bean 调用的 我知道当我将其编码为 MyBean myString 时 Jsf 重命名它并调用 getMyString 方法 然
  • 如何处理数据库的并发更新?

    处理 SQL 数据库中的并发更新的常见方法是什么 考虑一个简单的 SQL 模式 未显示约束和默认值 例如 create table credits int id int creds int user id 目的是为用户存储某种信用 例如就像
  • 您的帐户已具有来自同一计算机的有效 iOS 分发证书

    我正在尝试从我的机 器创建 IPA 创建 IPA 时 我收到错误 您的帐户已具有有效的 iOS 分发证书 我创建了证书和配置文件 因此我的所有代码签名身份都在我的计算机上 我可以使用相同的证书在设备中运行该应用程序 但无法构建 ipa 文件
  • 在 iOS8 下使用 CGAffineTransform 旋转时 UIView 不调整大小

    我有一个 UIViewController 当设备旋转时 它只旋转其中的一些子视图 这在 iOS7 下工作正常 但在 iOS8 下就崩溃了 看起来UIView的边界是通过iOS8下的变换来调整的 这是出乎意料的 这是一些代码 interfa