views:

248

answers:

1

I am creating a nav-based app with a view that floats at the bottom of the screen (Alpha .7 most of the time).

I create it like this...

// stuff to create the tabbar/nav bar.
// THIS ALL WORKS...
// then add it to subview.

[window addSubview:tabBarController.view];

// need this last line to display the window (and tab bar controller)
[window makeKeyAndVisible];

// Okay, here is the code i am using to create a grey-ish strip exactly `zlocationAccuracyHeight` pixels high at `zlocationAccuracyVerticalStartPoint` starting point vertically.

CGRect locationManagerAccuracyUIViewFrame = CGRectMake(0,zlocationAccuracyVerticalStartPoint,[[UIScreen mainScreen] bounds].size.width,zlocationAccuracyHeight);
self.locationManagerAccuracyUIView = [[UIView alloc] initWithFrame:locationManagerAccuracyUIViewFrame];
self.locationManagerAccuracyUIView.autoresizingMask = (UIViewAutoresizingFlexibleWidth);
self.locationManagerAccuracyUIView.backgroundColor = [UIColor darkGrayColor];
[self.locationManagerAccuracyUIView setAlpha:0];

CGRect locationManagerAccuracyLabelFrame = CGRectMake(0, 0,[[UIScreen mainScreen] bounds].size.width,zlocationAccuracyHeight);
locationManagerAccuracyLabel = [[UILabel alloc] initWithFrame:locationManagerAccuracyLabelFrame];

if ([myGizmoClass useLocationServices] == 0)
{
 locationManagerAccuracyLabel.text = @"GPS Accuracy: Using Manual Location";
}
else 
{
 locationManagerAccuracyLabel.text = @"GPS Accuracy: One Moment Please...";
}

locationManagerAccuracyLabel.font = [UIFont boldSystemFontOfSize:12];
locationManagerAccuracyLabel.textAlignment = UITextAlignmentCenter;
locationManagerAccuracyLabel.textColor = [UIColor whiteColor];
locationManagerAccuracyLabel.backgroundColor = [UIColor clearColor];
[locationManagerAccuracyLabel setAlpha:0];
[self.locationManagerAccuracyUIView addSubview: locationManagerAccuracyLabel];
[window addSubview: self.locationManagerAccuracyUIView];

this all works (i am not sure about the order i create the uiview in ... meaning i am creating the frame, the view, creating the "accuracy text" and adding that to the view, then adding the uiview as a subview of the window . It works and seems correct in my logic.

So, here is the tough part.

I have a timer that i am testing with. I am trying to float the uiview up by 30 pix.

here is that code:

[UIView beginAnimations:nil context:NULL];  
[UIView setAnimationDuration:0.3];  
CGRect rect = [ self.locationManagerAccuracyUIView frame];
NSLog(@"ORIGIN: %d x %d (%@)\n",rect.origin.x,rect.origin.y,rect);
rect.origin.y -= 30;
[UIView commitAnimations];

The problem? rect is nill, rect.origin.x and rect.origin.y are both zero.

Can anyone tell me why?

Here is how i set up self.locationManagerAccuracyUIView in my files:

Delegate.h

UIView     *locationManagerAccuracyUIView;
UILabel     *locationManagerAccuracyLabel;


...

@property (nonatomic, retain) IBOutlet UIView *locationManagerAccuracyUIView;
@property (nonatomic, retain) IBOutlet UILabel *locationManagerAccuracyLabel;

Delegate.m

...

@synthesize locationManagerAccuracyUIView;
@synthesize locationManagerAccuracyLabel;

...

BTW: Other places in another timer i DO set the alpha to fade in and out and THAT works! So locationManagerAccuracyUIView is valid and defined as a view...

For instance:

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[locationManagerAccuracyLabel setAlpha:1];
[UIView commitAnimations];

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];
[self.locationManagerAccuracyUIView setAlpha:.7];
[UIView commitAnimations];

...and it DOES work. Can anyone help me?

As an aside: I know, when typing this I used self.locationManagerAccuracyUIView and locationManagerAccuracyUIView interchangeably to see if for some reason that was the issue. It is not. :) Thx

+2  A: 

First: Rect is null because you are using a %@ to format it, which prints objects and it is not an object, it is a struct. If you want to print it out, convert it to a string using NSStringFromCGRect(rect) and print that instead. The only reason you're not crashing at that point is because the x-coordinate is stored first in the struct, and is equal to zero, which is the same as the null pointer.

Second, your origin is printing out as 0 possibly because you are using %d to format the x and y values, which prints out a signed decimal integer, but they are in fact decimal floating-point values.

Third: The frame of the view is not returned by reference. After you change the rect, you have to reassign it to the view. That is, this:

rect.origin.y -= 30;
[UIView commitAnimations];

should be this:

rect.origin.y -= 30;
self.locationManagerAccuracyUIView.frame = rect;
[UIView commitAnimations];
Ed Marty
This works -- GREAT! I do not know why i did not put the darn rect back in the UIView object. Thanks for thinking and explaining in detail -- when I did not think. Voted Accepted Answer!
Jann