从栏按钮项目呈现时,您通常希望禁用工具栏上的所有其他按钮,直到关闭操作表。
我认为最简单的方法是修改 UIToolbar 类。您需要一种方法来获取操作表,或许可以通过将其保存在应用程序委托中。
制作一个文件 UIToolbar+Modal.m,像这样:
@implementation UIToolbar (Modal)
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *hitView = [super hitTest:point withEvent:event];
UIActionSheet *mySheet = [[[UIApplication sharedApplication] delegate] myActionSheet];
if ([mySheet isVisible]) return nil;
else return hitView;
}
@end
.h 文件不需要包含任何特殊内容
@interface UIToolbar (Modal) {
}
@end
顺便说一句,在找到这个解决方案之前,我尝试将一个空数组分配给 passthroughViews,您可以按照 stalinkay 的描述(最初)访问它,但这实际上不起作用(除了没有记录之外)。
执行此操作的其他方法都有缺点 - 要么您必须处理方向更改,要么工具栏按钮看起来像是按下了,而实际上唯一采取的行动就是关闭操作表。
更新
从 iOS 4.3 开始,这不再有效。您需要子类化:
UIToolbarWithModal.h
#import <Foundation/Foundation.h>
@interface UIToolbarWithModal : UIToolbar {
}
@end
请记住,当您创建操作表时,您需要使其可访问,可能在您的应用程序委托中 - 在本示例中为 myActionSheet 属性。
UIToolbarWithModal.m
#import "UIToolbarWithModal.h"
#import "MyDelegate.h"
@implementation UIToolbarWithModal
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
UIView *hitView = [super hitTest:point withEvent:event];
UIActionSheet *mySheet = [[[UIApplication sharedApplication] delegate] myActionSheet];
if ([mySheet isVisible]) return nil;
else return hitView;
}
@end
然后只需在您之前使用 UIToolbar 的代码中使用 UIToolbarWithModal 即可。