我有一个奇怪的问题,当我更改视图的背景时,我再也看不到作为该视图子视图的UILabel。我无法转储计算器应用程序的标题,因为它在Swift中,我不知道UILabel的名称是什么,而FLEXing对此没有帮助。我想将子视图放在背景视图前面(有两个子视图),但我目前的两种方法都会使目标应用程序崩溃。我试图看看我是否可以在最前面只使用一个。
我的代码:
NSMutableArray *labels = [NSMutableArray arrayWithArray:((DisplayView*)self).allSubviews];
if ([labels count] > 0) {
UILabel *mainLabel = labels[0];
[self bringSubviewToFront:mainLabel];
}
((DisplayView*)self).allSubviews = labels;
我也尝试过:
for (UILabel *label in ((DisplayView*)self).allSubviews) {
if ([label isKindOfClass:[UILabel class]]) {
[self bringSubviewToFront:label];
}
我需要一种替代方法来实现这一目标,一种方法可以将所有的子视图转发给我,或者有人告诉我我做错了什么。 编辑,这是我的完整代码:
@interface DisplayView
@property (nonatomic, copy, readwrite) UIColor *backgroundColor;
@property (nonatomic, assign, readwrite, getter=isHidden) BOOL hidden;
@property (nonatomic, assign, readwrite, getter=isOpaque) BOOL opaque;
@property (nonatomic, assign, readwrite) CGFloat alpha;
@property (nonatomic, copy, readwrite) NSArray *allSubviews;
@property (nonatomic, assign, readwrite) CALayer *layer;
@end
%hook DisplayView
-(void)layoutSubviews {
((DisplayView*)self).opaque = NO;
((DisplayView*)self).backgroundColor = [UIColor blackColor];
((DisplayView*)self).hidden = NO;
((DisplayView*)self).alpha = 1.0;
NSMutableArray *labels = [NSMutableArray arrayWithArray:((DisplayView*)self).layer.sublayers];
if ([labels count] > 0) {
UILabel *mainLabel = labels[0];
[self bringSubviewToFront:mainLabel];
}
}
%end
%ctor {
%init(DisplayView=objc_getClass("Calculator.DisplayView"));
}
答案 0 :(得分:0)
似乎有几个可能的问题。首先,equals
上没有allSubviews
,它可能应该是UIView
。
subviews
(只是想指出你似乎没有改变数组,所以为什么要复制它?你可以直接访问NSMutableArray *labels = [NSMutableArray arrayWithArray:((DisplayView*)self).subviews];
if ([labels count] > 0) {
UILabel *mainLabel = labels[0];
)
其次,在self.subviews
版本中,您将CALayer
投射到CALayer
:
UIView
也许其中一些有帮助