Почему я не могу получить кадр UIView, чтобы переместить его? - PullRequest
0 голосов
/ 12 апреля 2010

Я создаю навигационное приложение с видом, который плавает в нижней части экрана (Альфа .7 большую часть времени).

Я создаю это так ...

// 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];

это все работает (я не уверен насчет порядка, в котором я создаю uiview в ... то есть я создаю фрейм, представление, создаю "текст точности" и добавляю его в представление, затем добавляю uiview как Подвид окна. Это работает и кажется правильным в моей логике.

Итак, вот сложная часть.

У меня есть таймер, с которым я тестирую. Я пытаюсь увеличить изображение на 30 пикселей.

вот этот код:

[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];

Проблема? rect равно nill, rect.origin.x и rect.origin.y равны нулю.

Может кто-нибудь сказать мне, почему?

Вот как я могу настроить self.locationManagerAccuracyUIView в моих файлах:

delegate.h

UIView     *locationManagerAccuracyUIView;
UILabel     *locationManagerAccuracyLabel;


...

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

Delegate.m

...

@synthesize locationManagerAccuracyUIView;
@synthesize locationManagerAccuracyLabel;

...

Кстати: в других местах в другом таймере я ДЕЙСТВИТЕЛЬНО устанавливаю альфа на постепенное увеличение и уменьшение, и это работает! Поэтому locationManagerAccuracyUIView является действительным и определено как представление ...

Например:

[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];

... и это работает. Кто-нибудь может мне помочь?

В качестве отступления: я знаю, что при наборе этого текста я использовал self.locationManagerAccuracyUIView и locationManagerAccuracyUIView взаимозаменяемо, чтобы узнать, почему по какой-то причине это было проблемой. Это не. :) Thx

1 Ответ

2 голосов
/ 13 апреля 2010

Первое: Rect имеет значение null, потому что вы используете %@ для его форматирования, который печатает объекты, и это не объект, а структура. Если вы хотите распечатать его, преобразуйте его в строку, используя NSStringFromCGRect(rect), и распечатайте ее вместо этого. Единственная причина, по которой вы не сбоите в этой точке, заключается в том, что координата x сохраняется первой в структуре и равна нулю, что совпадает с нулевым указателем.

Во-вторых, ваш источник печатает как 0, возможно, потому что вы используете% d для форматирования значений x и y, которые выводят десятичное целое число со знаком, но на самом деле это десятичные значения с плавающей запятой.

В-третьих: кадр представления не возвращается по ссылке. После того, как вы измените прямоугольник, вы должны переназначить его на представление. То есть это:

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

должно быть так:

rect.origin.y -= 30;
self.locationManagerAccuracyUIView.frame = rect;
[UIView commitAnimations];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...