如何访问当前固定格式页面的所有控件并进行修改。当然若是随着内容不断变化的页面,你可能找不到对应的控件,所以无法修改。另外有的第三方库会来回改控件的属性,你就是把它的属性修改了,第三方库也可能重新修改回去。
我们经常用到第三方的SDK,只有头文件,拿不到源代码,那么就可以采用启动一个定时器扫描几次修改它的属性了(如控件的显示和隐藏,文本颜色)。
下面给出了打印当前页面的所有控件及编号。首先可以通过基本类型和位置来确定你修改的控件,若实在找不到通过编号也能找到。只要找到控件和编号你想怎么修改还不是轻而易举的事情。具体的修改控件的我就不再本文累述了。至于单窗口我也不写了,只写多窗口的情况
- (void)dumpView:(UIView *)aView atIndent:(int)indent into:(NSMutableString *)outstring { for (int i = 0; i < indent; i++) [outstring appendString:@"--"]; [outstring appendFormat:@"[%2d] %@, height:%f, origin.y:%f\n", indent, [[aView class] description], aView.frame.size.height, aView.frame.origin.y]; for (UIView *view in [aView subviews]) [self dumpView:view atIndent:indent + 1 into:outstring]; } // Start the tree recursion at level 0 with the root view - (NSString *) displayViews: (UIView *) aView { NSMutableString *outstring = [[NSMutableString alloc] init]; [self dumpView: aView atIndent:0 into:outstring]; return outstring; } // Show the tree - (void)logViewTreeForMainWindow { NSLog(@"The view tree:\n%@", [self displayViews:BRGetKeyWindow()]); } /** 获取 keyWindow */ static inline UIWindow *BRGetKeyWindow(void) { UIWindow *keyWindow = nil; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000 // 编译时检查SDK版本:Xcode11+编译会调用(iOS SDK 13.0 以后版本的处理) if (@available(iOS 13.0, *)) { NSSet<UIScene *> *connectedScenes = [UIApplication sharedApplication].connectedScenes; for (UIScene *scene in connectedScenes) { if (scene.activationState == UISceneActivationStateForegroundActive && [scene isKindOfClass:[UIWindowScene class]]) { UIWindowScene *windowScene = (UIWindowScene *)scene; for (UIWindow *window in windowScene.windows) { if (window.isKeyWindow) { keyWindow = window; break; } } } } } else #endif { #if __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 return [UIApplication sharedApplication].keyWindow; #endif } return keyWindow; }
使用的代码:
-(void)loginAction:(UIButton *)button{ [self logViewTreeForMainWindow]; return; }
打印的日志:
The view tree: [ 0] UIWindow, height:896.000000, origin.y:0.000000 --[ 1] UITransitionView, height:896.000000, origin.y:0.000000 ----[ 2] UIDropShadowView, height:896.000000, origin.y:0.000000 ------[ 3] UILayoutContainerView, height:896.000000, origin.y:0.000000 --------[ 4] UINavigationTransitionView, height:896.000000, origin.y:0.000000 ----------[ 5] UIViewControllerWrapperView, height:896.000000, origin.y:0.000000 ------------[ 6] UIView, height:896.000000, origin.y:0.000000 --------------[ 7] PPPasswordLoginView, height:896.000000, origin.y:0.000000 ----------------[ 8] UIView, height:862.000000, origin.y:0.000000 ------------------[ 9] UIButton, height:20.000000, origin.y:60.000000 --------------------[10] UIImageView, height:16.000000, origin.y:2.000000 --------------------[10] UIButtonLabel, height:0.000000, origin.y:0.000000 ------------------[ 9] UIButton, height:20.000000, origin.y:331.000000 --------------------[10] UIButtonLabel, height:15.000000, origin.y:2.500000 ------------------[ 9] UILabel, height:21.000000, origin.y:128.000000 ------------------[ 9] UILabel, height:14.000000, origin.y:157.000000 ------------------[ 9] UIView, height:1.000000, origin.y:257.000000 ------------------[ 9] UIView, height:1.000000, origin.y:317.000000 ------------------[ 9] UILabel, height:25.000000, origin.y:280.000000 ------------------[ 9] UIButton, height:25.000000, origin.y:280.000000 --------------------[10] UIButtonLabel, height:0.000000, origin.y:0.000000 ------------------[ 9] KeyBoardTextField, height:15.000000, origin.y:230.000000 --------------------[10] UITextFieldLabel, height:15.000000, origin.y:0.000000 --------------------[10] UIFieldEditor, height:15.000000, origin.y:0.000000 ----------------------[11] _UITextLayoutCanvasView, height:15.000000, origin.y:0.000000 ------------------------[12] _UITextLayoutFragmentView, height:15.000000, origin.y:-1.500000 ------------------------[12] UITextSelectionView, height:0.000000, origin.y:0.000000 --------------------------[13] UIView, height:15.000000, origin.y:0.000000 ------------------[ 9] KeyBoardTextField, height:15.000000, origin.y:290.000000 --------------------[10] UITextFieldLabel, height:15.000000, origin.y:0.000000 --------------------[10] _UITextLayoutCanvasView, height:15.000000, origin.y:0.000000 ----------------------[11] _UITextLayoutFragmentView, height:15.000000, origin.y:-1.500000 ------------------[ 9] UIButton, height:13.000000, origin.y:461.500000 --------------------[10] UIButtonLabel, height:15.000000, origin.y:-1.000000 ------------------[ 9] UIButton, height:13.000000, origin.y:461.500000 --------------------[10] UIButtonLabel, height:15.000000, origin.y:-1.000000 ------------------[ 9] UIButton, height:44.000000, origin.y:382.000000 --------------------[10] UIButtonLabel, height:21.000000, origin.y:11.500000 ------------------[ 9] UIView, height:12.000000, origin.y:462.000000 ------------------[ 9] DYSelectAgreeLoginPanel, height:13.000000, origin.y:817.000000 --------------------[10] UIButton, height:30.000000, origin.y:-9.000000 ----------------------[11] UIButtonLabel, height:0.000000, origin.y:0.000000 --------------------[10] BGSwapButton, height:12.000000, origin.y:0.000000 ----------------------[11] UIImageView, height:12.000000, origin.y:0.000000 --------------------[10] UILabel, height:13.000000, origin.y:0.000000 --------------------[10] UIButton, height:13.000000, origin.y:0.000000 ----------------------[11] UIButtonLabel, height:15.000000, origin.y:-1.000000 --------------------[10] UILabel, height:13.000000, origin.y:0.000000 --------------------[10] UIButton, height:13.000000, origin.y:0.000000 ----------------------[11] UIButtonLabel, height:15.000000, origin.y:-1.000000 --------------[ 7] DYLoginPanel, height:61.000000, origin.y:738.000000 ----------------[ 8] UIView, height:0.500000, origin.y:6.250000 ----------------[ 8] UILabel, height:13.000000, origin.y:0.000000 ----------------[ 8] UIView, height:0.500000, origin.y:6.250000 ----------------[ 8] UIButton, height:40.000000, origin.y:0.000000 ------------------[ 9] UIImageView, height:40.000000, origin.y:0.000000 ------------------[ 9] UIButtonLabel, height:0.000000, origin.y:0.000000 ----------------[ 8] UIButton, height:40.000000, origin.y:0.000000 ------------------[ 9] UIImageView, height:40.000000, origin.y:0.000000 ------------------[ 9] UIButtonLabel, height:0.000000, origin.y:0.000000 ----------------[ 8] UILabel, height:12.000000, origin.y:48.000000 ----------------[ 8] UILabel, height:12.000000, origin.y:48.000000
注意:若你放在首页的viewWillAppear中打印可能打印出来的是The view tree: [ 0] (null), height:0.000000, origin.y:0.000000。因为该方法访问的是已经显示出来的控件(包括隐藏的控件),必定从你加载控件到实际显示出来之间需要时间,所以要用定时器扫描几次才能保证修改成功。