0

我正在开发一个 iOS 应用程序的辅助功能项目。因为可访问性并不像宣传的那样,我必须在子类中覆盖accessibilityFrame,accessibilityActivationPointpointInside:withEvent,以便将 VoiceOver 识别的区域(用于绘图和触摸识别)扩展到控制视图的“自然”边界之外。因此,为了更改 a 的 VoiceOver 边界,UIButton我必须将该类子类化,然后添加这三个方法。为了做到这一点,UILabel我必须使用代码添加另一个子类,依此类推。

我可以将这些方法中的代码重构到一个中心位置,但我想知道这是否可以通过继承更优雅地完成。我想将此代码放入UIView(可能称为UIViewAccessible)的子类中,然后创建一个UIButton被调用的子类,该子类UIButtonAccessible继承自该子类,而该子类UIButton又将继承自. 这是可能的,还是可以用一个类别来完成这样的事情?UIViewAccessibleUIView

编辑:根据文档,您无法通过类别真正实现这一目标:

如果在一个类别中声明的方法的名称与原始类中的方法相同,或者与同一类(甚至是超类)上的另一个类别中的方法相同,则对于在哪个方法实现中使用的行为是不确定的运行。

还有其他方法可以做到这一点吗?

4

1 回答 1

2

要回答您的问题,不,它不能,因为您是继承链中UIViewAccessible的二级兄弟(两者都在某个时候继承)。但我猜你已经知道了。至于解决方案,您可以将可访问的类包装成一个装饰器,并使用强类型协议。这样您就可以将代码保存在一个地方。我在这里更详细地描述了这种技术(尽管出于不同的目的,但情况相同)。UIButtonUIViewUIView

对于支持可访问性的视图,您必须这样做:

@property (nonatomic, strong) UIView<MyAccesibilityProtocol>* view;

//self.view can come from the nib or previously created in code
self.view = [[AccesibilityDecorator alloc] initWithDecoratedObject:self.view];

//you can then use self.view like any other UIView, 
//and because it also implements an 
//accessibility protocol, you can use the methods 
//implemented in the wrapper as well.
//more than that, you can control which methods to override
//in the AccesibilityDecorator class
[self.view addSubview:otherView];//could be overridden or not
[self.view myAccesibilityMethod];//custom method declared in the protocol
于 2013-03-01T05:44:00.020 回答