UIView 的 contentScaleFactor 取决于实现drawRect:?

2023-12-21

我偶然发现了一件奇怪的事情。看起来像UIView's contentScaleFactor即使在 Retina 设备上也始终为 1,除非您实现drawRect:。考虑这段代码:

@interface MyView : UIView
@end

@implementation MyView

- (id) initWithFrame: (CGRect) frame
{
    self = [super initWithFrame: frame];
    if (self) {
        NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale);
    }
    return self;
}

- (void) didMoveToWindow
{
    if (self.window)
        NSLog(@"%s %g %g %g", __PRETTY_FUNCTION__, self.contentScaleFactor, self.layer.contentsScale, [UIScreen mainScreen].scale);
}

@end

在 Retina 设备上,它打印以下内容:

-[MyView initWithFrame:] 1 1 2
-[MyView didMoveToWindow] 1 1 2

如果我添加一个空的实现drawRect:像这样:

- (void) drawRect: (CGRect) rect
{
}

它按预期工作:

-[MyView initWithFrame:] 2 2 2
-[MyView didMoveToWindow] 2 2 2

因此,看起来视图是否位于任何视图层次结构中以及它显示在哪种屏幕上并不重要。唯一重要的是视图是否实现drawRect: or not.

这是一个错误还是一个功能?我知道我可以改变didMoveToWindow如下修复它

- (void) didMoveToWindow
{
    if (self.window)
        self.contentScaleFactor = self.window.screen.scale;
}

但默认行为仍然让我烦恼。

你可能会问我为什么需要contentScaleFactor如果我不画任何东西的话。那是因为我刚刚设置self.layer.contents到现成的图像,然后用contentStretch。但是,图像在 Retina 设备上无法正确拉伸,除非contentScaleFactor设置正确,即使@2x使用图像。准确地说,它可以正常工作unless a @2x使用图像。我猜这是一个错误。

谁能分享您对原因的见解contentScaleFactor有这样的行为吗?它仅适用于 iOS 5 吗?


据推测,如果你不覆盖drawRect:那么 UIKit 知道UIView不绘制任何内容,因此它需要(大概)快速的情况,即内容比例为 1 的图层。一旦您覆盖drawRect:不过,它知道需要设置一个具有正确内容比例的图层,如果您愿意,您可以将其绘制到其中。它不知道你什么也没做drawRect:但它不能做出与以前相同的假设。

事实上,文档中提到了所有这些:

对于实现自定义drawRect:方法的视图并与窗口关联,此属性的默认值是与当前显示视图的屏幕关联的比例因子。

你为什么不直接覆盖drawRect:并在其中画出你的形象?或者您可能可以摆脱当前正在做的事情并拥有一个存根drawRect:。鉴于文档所说的,我想说这是完全合理的假设它会继续工作并且是正确的行为。

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

UIView 的 contentScaleFactor 取决于实现drawRect:? 的相关文章

  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 使用 UItableviewCell 实现 Google 地图

    我正在尝试在 UItableviewCell 组件内实现谷歌地图 我这样做的方法是在原型单元中定义 GMSMapView 然后使用 dequeueReusableCell 方法配置地图单元 但是 我尝试应用的任何更改都会失败 例如添加标记
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • iOS Safari Mobile 禁用上一个和下一个选择输入

    上周五我发现了关于此问题的类似问题 但似乎无法再次找到它 如果有人能指出我正确的方向 那就太好了 本质上我在一个页面上有多个选择菜单 第一个在加载时填充 第二个在第一个选择时填充 够简单的 但是 在 iOS 设备中 当您点击选择元素时 它会
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • ReactiveCocoa 将 SignalProducers 合二为一

    我正在使用 ReactiveCocoa 并且我有几个 SignalProducers let center NSNotificationCenter defaultCenter let signalProducer1 center rac
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self

随机推荐

  • Spring Hibernate - 无法获取当前线程的事务同步会话

    我为什么要发布这个 经过几个小时的搜索 分析 变得偏执后 我想与您分享我的错误 我确定了问题的原因 什么时候发生的 在应用程序服务器内 在我的例子中嵌入了tomcat 测试没有问题 在两个特定的 Services 上 方法已使用 Trans
  • 在 C# 中使用 vb.net 类

    如何在 vb net 中创建类型并在 C 中使用该类型 我想我需要编译 vb 项目并添加对 dll 的引用 但不知道这是否是正确的方法 或者引用是否有效 这样做并不是为了好玩 我们有一些 vb 代码 我们正在考虑这个选项 只需在 VB 中创
  • 是否可以在运行时传递 Typescript 装饰器对象值?

    我有一个用 MinDate 约束装饰的类 如下所示 export default class Order purchaseDate Date MinDate this purchaseDate receiptDate Date 当尝试验证一
  • 在 mvc ef 中动态选择两个标签作为显示名称

    我正在使用实体框架 MVC 如何在一个数据字段的两个标签之间动态更改 基于从同一车辆的另一个数据库检索的数据 理想情况下 我希望我的模型类中包含类似的内容 这是伪代码 预计不会编译 Display Name resCatalyst Reso
  • frama-c生成的pdgs中的圆节点是什么意思

    我使用frama c工具来分析下面的代码 int main int argc char argv int i a for i 0 i lt 100 i 1 a 0 if a 0 continue else break return 0 命令
  • 您如何知道 Kafka 代理上的主题何时创建?

    你怎么知道Kafka中的主题是什么时候创建的 似乎有一些主题是使用错误数量的分区创建的 有没有办法知道主题的创建日期 据说 创建了一个名为 test 的主题n分区数 如何找到在 Kafka 上创建此 测试 主题的日期和时间 可以看到Kafk
  • 使用 AFNetworking 3.0 上传图像[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在尝试使用 AFNetworking 3 0 将图像上传到服务器 这是我的代码 AFHTTPSessionManag
  • 将 kerberos 票证添加到肥皂请求

    我有一个问题如下 我有一个 Web 服务 并且我想使用 Kerberos 进行身份验证 我通过添加服务引用来添加我的 Visual Studio wsdl 它创建了一个代理类 可以这么说 reference cs 可以调用该服务 他现在想要
  • 通过HCE付款

    我一直在开发需要实现点击付款的应用程序 我能够将 HCE 服务与 NFC 终端连接 现在我的问题是接下来的步骤是什么 用它进行实际付款 我到处搜索 但找不到合适的文档 请帮我 下面是我编写的用于将 HCE 服务连接到 NFC 终端的代码 安
  • Plotly:如何更改绘图表达散点图的配色方案?

    我正在尝试与plotly https plotly com 具体来说ploty express https plotly com python plotly express 构建一些可视化 我正在建造的东西之一是散点图 https plot
  • Android 选项菜单项中没有显示图标[重复]

    这个问题在这里已经有答案了 我创建了一个带有我自己制作的图标 24px x 24px 的选项菜单 但它没有显示 我的 xml 中的代码 位于 res menu 中 如下 menu menu
  • 创建一个循环来检查排列中的循环

    我的家庭作业让我检查用户输入的数字中所有可能的循环符号 我已将输入发送到数组中 但我不确定如何启动循环 我如何编辑此循环以不多次显示相同的数字 第一次发帖 格式不对 请见谅 example of user input var permuta
  • 这可能是初学者最好的backbonejs教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对backbone js很感兴趣 但当我学习的时候 在创建结构时有很多困惑 有人可以向我展示一个带有很好示例的简单教程吗 这对所有新学习
  • Bootstrap Carousel 多个项目一次移动一个项目[重复]

    这个问题在这里已经有答案了 我尝试使用引导程序创建多个项目轮播 我的问题是它会同时移动所有 3 个项目 而不是仅移动一个 请在此处查看演示 http plnkr co edit Fl0HZaU5x5ZkPEVo87u3 p preview
  • 双重释放或腐败(fasttop)

    我的代码的以下部分在执行时给了我这条消息 检测到glibc a out 双重释放或损坏 fasttop 0x08e065d0 问题就在这里 temp2 first 基本上 当您释放 temp2 时 您首先释放 而不是此处分配的内存 temp
  • 无法将动态生成的图像从任何浏览器粘贴到 MS Word

    我有一个生成图像然后将其推送到浏览器的应用程序 图像显示完全没有困难 还可以右键保存 并且可以毫无问题地粘贴到Gimp等应用程序中 但不能粘贴到MS Word中 我摆弄了应用程序的各个方面 以确保内容类型和所有其他标题都正确 但这对粘贴图像
  • 如何设置上传文件的最大大小

    我正在使用 JHipster 开发基于 Spring Boot 和 AngularJS 的应用程序 我的问题是如何设置上传文件的最大大小 如果我尝试上传到大文件 我会在控制台中收到以下信息 DEBUG 11768 io 8080 exec
  • 如何将回调函数传递给 StreamController

    我想知道我正在创建这样的 StreamController class StreamController controller new StreamController onListen onListen onPause onPause o
  • 谷歌云存储交易?

    看来GCS没有任何交易机制 它是否正确 我希望能够进行长期交易 例如 如果我可以启动一个事务并指定过期时间 如果未在 X 时间内提交 它将自动回滚 那就太好了 然后我可以使用这个句柄插入对象 组合 删除等 如果一切顺利 发出 isCommi
  • UIView 的 contentScaleFactor 取决于实现drawRect:?

    我偶然发现了一件奇怪的事情 看起来像UIView s contentScaleFactor即使在 Retina 设备上也始终为 1 除非您实现drawRect 考虑这段代码 interface MyView UIView end imple