菜鸟教程小白 发表于 2022-12-12 18:24:43

ios - 使用 swizzling 更改 UIAlertView


                                            <p><p>我最近收到了一个私有(private)硬件 SDK,可以集成到我公司的移动应用中。一切都很好,除了他们使用 <code>UIAlertView</code> 作为一些不透明的方法调用的结果,我的设计团队想要给它打上烙印。我无权访问 SDK 的源代码。有没有一种方法可以安全地调整 <code>UIAlertView</code> 以保留所有功能并简单地修改 <code>UIAlertView</code> 的外观,使其与应用外观更具品牌/一致?如果是这样,我会重载 <code>drawRect</code> 或其他东西,我将如何弄清楚 <code>UIAlertView</code> 中标签的名称是什么,以便我可以用大小绘制它们,我想要的形状和颜色?</p>

<p>为了补充细节,该应用目前不使用 <code>UIAlertView</code> 或 <code>UIAlertViewController</code>,因此理论上 swizzling 只会影响这个闭源 SDK 所发生的一切。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这根本不简单。</p>

<hr/>

<p>如果 SDK 使用 <code>UIAlertView</code>,请尝试 <a href="http://nshipster.com/method-swizzling/" rel="noreferrer noopener nofollow">swizzling</a> <code>show</code> 方法。</p>

<p>您的实现应大致执行以下操作:</p>

<p>1) 不要让原始 UIAlertView 显示 - 很难自定义它。</p>

<p>2) 保留旧 <code>.delegate</code> 的引用,以便在需要时通知它。</p>

<p>3) 创建自己的自定义 UIView 并使用 <code>[.keyWindow addSubview:myCustomAlertView];</code>。 </p>

<p>4)我相信你可以使用它的属性如</p>

<pre><code>@property(nonatomic,copy) NSString *title;
@property(nullable,nonatomic,copy) NSString *message;
- (nullable NSString *)buttonTitleAtIndex:(NSInteger)buttonIndex;
@property(nonatomic,readonly) NSInteger numberOfButtons;
@property(nonatomic) NSInteger cancelButtonIndex;
</code></pre>

<p>5) 创建您自己的设计并在需要时调用相应的委托(delegate)方法。</p>

<hr/>

<p>其他方法是使用 Apple 的 Private API,但这可能会导致不好的结果。 </p>

<p><strong>这是一种非常 HACKY 的方法。首先,您无法保证它甚至会起作用。其次,您的应用可能会被拒绝。因此,我不会真的推荐它...</strong></p>

<p>但是,如果您真的想采用这种方法,请尝试这样做:</p>

<p><code>;</code> 延迟一段时间后查看其属性(即 0.01 秒就足够了):</p>

<p> <a href="/image/IFFdI.png" rel="noreferrer noopener nofollow"><img src="/image/IFFdI.png" alt="enter image description here"/></a> </p>

<p>现在查找可疑属性(可能属于 UIView 类),这些属性可能包含与 UI 相关的信息。例如,<code>__representer</code> 看起来很有趣——它有约束,它有 <code>labelContainerView</code>...尝试使用这些属性。</p>

<p>为了获得该 <code>__representer</code>,请使用 KVC 和 KVO(即以 <code>id theAlertController = ;</code> 开头)。然后越潜越深。</p>

<p>希望您能够找到有用的属性,并能够通过 KVC 更改它们的值。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用 swizzling 更改 UIAlertView,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35136998/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35136998/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用 swizzling 更改 UIAlertView