问题标签 [swizzling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1419 浏览

objective-c - iOS 模糊文本:一劳永逸地检测和解决它?

我不止一次遇到 UIView(子类)以小数偏移结束的情况,例如因为它的尺寸是奇数并且居中,或者因为它的位置基于奇数大小的容器的中心。

这会导致文本(或图像)模糊,因为 iOS 会尝试在半像素偏移上渲染视图(和子视图)。我觉得要求CGRectIntegral()每次换帧都不是一个完美的解决方案。

我正在寻找轻松检测这些情况的最佳方法。在写这个问题时,我想出了一个相当激进的方法,它在我当前的项目中显示出比我想象的更多的偏差。

所以这是为了分享。非常欢迎对更好或更不激进的替代方案提出评论和建议。

主文件

UIViewOverride.m

这是作为 UIView 子类实现的,可以避免强制转换和/或编译器警告。

有问题的视图将生成日志消息并显示为红色或绿色透明。

-DDEBUGVIEW在调试模式下设置为编译器标志。

0 投票
2 回答
836 浏览

objective-c - Method Swizzling - 如何确保方法在被调用之前被 swizzled

我正在使用 SIMBL 调配第三方应用程序创建 NSMenuItems 的方法,但是在初始化我的方法调配之前创建菜单项的时间有 50/50。

什么是确保我的调酒总是第一位的干净方法?我想我可以调配 applicationDidFinishLaunching: 并继续我的调配。但我担心我会在那里遇到同样的错误,在我的实际调酒到位之前将调用 applicationDidFinishLaunching。

约翰

0 投票
8 回答
40752 浏览

ios - Objective-C 中方法混用的危险是什么?

我听说人们说方法混合是一种危险的做法。甚至名称 swizzling 也暗示它有点作弊。

Method Swizzling正在修改映射,以便调用选择器 A 将实际调用实现 B。它的一种用途是扩展封闭源类的行为。

我们能否将风险形式化,以便决定是否使用 swizzling 的任何人都可以做出明智的决定,是否值得他们尝试做的事情。

例如

  • 命名冲突:如果该类后来扩展其功能以包含您添加的方法名称,则会导致大量问题。通过合理命名混合方法来降低风险。
0 投票
2 回答
12698 浏览

objective-c - 如何实现方法调配?

我正在尝试使用 SIMBL 修改程序的行为(我没有它的源代码)。我使用了类转储,发现我需要覆盖一个实例方法

此方法在称为控制器的类中。我需要做的就是获取参数 arg1 就可以了。也许 NSLog 它或发布通知...我阅读了有关在 Objective-C 中调配的方法,但我该如何使用它?我需要参考我没有课程的 MessageController 类。

谢谢!

0 投票
1 回答
654 浏览

iphone - iPhone:我想出了一个有趣的方法来绕过 API 限制。这行得通吗?

我试图解决的问题是:

使用 UIImagePicker 时,它会在设备旋转时自行调整。我不希望它这样做,而是应该始终保持纵向。我用谷歌搜索了很多,但没有找到任何解决方案(只是其他人有同样的未解决问题)。唯一的答案是使用私有 API 调用,我宁愿不冒险这样做。

-

然而,我遇到了' method swizzling '——一种在运行时交换方法名称的方法。我打算做什么:

  • 向 UIViewController 添加一个类别,该类别定义了一个方法,例如“customShouldRotate”,定义了不允许旋转的自定义行为。

  • 在运行时将这些方法与 UIViewController 的默认旋转方法混合。

-

不过想了想,可能没那么简单。这就是为什么 - 任何对以下内容的回答将不胜感激。

  • 我正在调整的方法是在 UIViewController,而不是 UIImagePickerController。我不能直接在图像选择器中进行调整,我已经尝试过通过子类化,它似乎是处理旋转的子视图控制器,而不是 UIImagePickerController 本身。混合的方法是否会传递给子类,如果没有,那么是否有解决方法来做到这一点?

  • 它可能不是 UIImagePickerController 中使用的 UIViewController 的正常旋转方法。有没有办法告诉?

  • Apple 会接受方法调配吗?我没有使用私有 API 调用,但是如果他们无论如何都拒绝它,我也不会过于惊讶。

-

这整个想法是否可行/值得尝试 - 或者,如果有人实际上以不同的方式解决了原始问题,那会更好。

0 投票
3 回答
891 浏览

iphone - 自定义导航栏隐藏按钮

希望您也能对此有所帮助...我想通过添加自定义背景图片来自定义导航栏。我发现了一个完美但有点复杂的方法,叫做:NavigationSwizzle。在以前的项目中,我没有任何严重的问题,但现在我被困住了......

从我的 AppDelegate 我调用这个静态方法:

}

在通过将第二个视图控制器推到堆栈上调用第二个视图控制器之后,在 rootNavigationController 中,我的右键、self.title、activityIndi​​cator 不显示。如果我在[navBar insertSubview:imageView atIndex:0]行中评论或设置atIndex:-1 ; 然后按钮显示,但我的自定义背景消失了,我得到了常规的 iPhone 导航选项卡。

rootNavigationController的didSelectRowAtIndex中,我有:

先感谢您...

如果您需要更多代码或解释,请随时问我...

最好的问候,卢卡

编辑:

好的,我可以让这个问题更简单。我的导航栏中有一个自定义背景图像。这张图显然覆盖了我的

如果我将 alpha 设置为:背景中 imageView 的 0.3,我可以看到我的标题:

所以问题是如何将我的 navigationItem.title 发送到前面?它是 UIView 类的后代吗?

编辑 2: 真正奇怪的是,在 rootController 中标题是可见的(在背景图像上方),但是在推动另一个 viewController 标题之后,背景 imageView ?!

0 投票
2 回答
1122 浏览

objective-c - Swizzling initWithFrame:不适用于 NIB 中的对象

我在 MKMapView 和 UIScrollView 上调配 initWithFrame: 和 dealloc 以添加和删除通知侦听器以监视与外部设备的连接,这样我就可以为这些视图连接额外的手势识别器,如下所示:

这对于我在代码中创建的视图非常有用,但是如果我在 XIB 中声明它们,我的方法就不会被调用。我使用 swizzling 而不是继承,因为我不想硬编码这种支持——我希望能够在每个目标的基础上添加它。

我可以做些什么来挂钩这些对象,以便我可以为这些类型的所有对象添加我的手势识别器,无论我是通过编程方式还是在 NIB 中创建它们?

0 投票
1 回答
1717 浏览

objective-c - 如何调用我使用 Objective-C 中的 class_getInstanceMethod 保存的方法?

如何调用我之前使用以下代码保存的方法:

正如您可能想象的那样,调用[SomeClass someMethod]不会起作用,因为后来我混合了原始方法。

0 投票
2 回答
1223 浏览

objective-c - NSArray 的方法调配

我正在尝试在 NSArray 上调试某些东西,但我什至找不到导致问题的数组指针是什么,我不知道为什么会这样。我在 objectAtIndex: (out of bounds) 上遇到错误,它似乎来自一些内部 NSView 方法......无论如何,我尝试使用自己的方法调整 objectAtIndex: ,但它不起作用。奇怪的是我可以用另一个类和方法做同样的事情,而且效果很好。这是我正在做的调酒:

它不工作。有谁知道为什么?

更新:谢谢戴夫,这可能是问题所在。我也有 getClassMethod 而不是实例。无论如何,这就是我最终做的事情:

0 投票
2 回答
4355 浏览

glsl - 什么是 OpenGL ES 2.0 中的 swizzling?(特别是 PowerVR SGX。)

PowerVR 说

Swizzling lowp 向量的组件是昂贵的,应该避免。

究竟什么是调酒?

但是vec3(color.b, color.r, color.g),或者vec3(color),当颜色是 vec4 时呢?

访问或修改单个组件是否构成混搭?我真的不这么认为,但如果不是,那么您可以通过手动执行更多的分配操作来解决 swizzling。我这样做没有问题,但对我来说这似乎很神奇,如果你可以通过编写没有 swizzle 符号的代码以更快的速度获得相同的效果。