Here is a helpful routine you can use on the iPhone to traverse the view hierarchy when you want to know what's being created and where it's going.
This routine dumps the view hierarchy to NSLog starting at the view passed in. Subviews show their index in the subviews array and all super classes in order separated by a colon with the frame size at the end.
To dump the entire view hierarchy of your application, call the method like this:
dumpViews([[UIApplication sharedApplication] keyWindow], @"", @"");
To display the hierarchy of the the camera view, override this method in your controller:
navigationController:willShowViewController:viewController:animated
and call the dump routine like this:
dumpViews(self.modalViewController.view, @"", @"");
For all other views:
dumpViews(myView, @"", @"");
Source
void dumpViews(UIView* view, NSString *text, NSString *indent)
{
Class cl = [view class];
NSString *classDescription = [cl description];
while ([cl superclass])
{
cl = [cl superclass];
classDescription = [classDescription stringByAppendingFormat:@":%@", [cl description]];
}
if ([text compare:@""] == NSOrderedSame)
NSLog(@"%@ %@", classDescription, NSStringFromCGRect(view.frame));
else
NSLog(@"%@ %@ %@", text, classDescription, NSStringFromCGRect(view.frame));
for (NSUInteger i = 0; i < [view.subviews count]; i++)
{
UIView *subView = [view.subviews objectAtIndex:i];
NSString *newIndent = [[NSString alloc] initWithFormat:@" %@", indent];
NSString *msg = [[NSString alloc] initWithFormat:@"%@%d:", newIndent, i];
dumpViews(subView, msg, newIndent);
[msg release];
[newIndent release];
}
}
Example Camera Dump
UIView:UIResponder:NSObject {{0, 0}, {320, 480}} 0: PLCameraView:UIView:UIResponder:NSObject {{0, 0}, {320, 480}} 0: UIView:UIResponder:NSObject {{0, 0}, {320, 427}} 1: UIImageView:UIView:UIResponder:NSObject {{10000, 10000}, {320, 480}} 2: UIView:UIResponder:NSObject {{0, 427}, {320, 53}} 3: PLCropOverlay:UIView:UIResponder:NSObject {{0, 0}, {320, 480}} 0: UIImageView:UIView:UIResponder:NSObject {{0, 20}, {320, 96}} 1: PLCropLCDLayer:UIView:UIResponder:NSObject {{0, 20}, {320, 96}} 2: TPBottomDualButtonBar:TPBottomButtonBar:TPBottomBar:UIView:UIResponder:NSObject {{0, 384}, {320, 96}} 0: TPPushButton:UIThreePartButton:UIPushButton:UIControl:UIView:UIResponder:NSObject {{22, 26}, {128, 47}} 1: TPCameraPushButton:TPPushButton:UIThreePartButton:UIPushButton:UIControl:UIView:UIResponder:NSObject {{170, 26}, {128, 47}} 0: UIImageView:UIView:UIResponder:NSObject {{51, 12}, {26, 19}}