создать представление программно с фреймом, установленным на фрейм суперпредставления? - PullRequest
10 голосов
/ 09 ноября 2010

У меня есть приложение на основе навигации, в котором я размещаю свои пользовательские виды в виде навигации.

Во-первых, я хочу знать, как получить фрейм "вида навигации", чтобы я мог разместить свой собственный видна нем правильно.
Кроме того, я иногда скрываю панель навигации и хочу убедиться, что я правильно получаю информацию о кадре.(не с [[UIScreen mainScreen] bounds])

Во-вторых, как вообще получить доступ к кадру суперпредставления, чтобы я мог соответственно разместить представление?
Я попытался выполнить следующее безуспешно.

-(void) loadView {
[super loadView];
UIView* myView = [[UIView alloc] initWithFrame: CGRectZero];
self.view = myView;
self.view.frame = self.view.superview.frame;
[myView release];
}

или установка фрейма в layoutSubviews, но заметил, что layoutSubviews не вызывается.Я думаю, это потому, что у меня нет никаких подпредставлений в этом конкретном представлении?

Спасибо

-Edit-

с данными ответами, теперь я знаю, что мне нужноустановите view.frame в границы superview.
Проблема в том, что я не могу получить доступ к superview внутри viewDidLoad.
Я вижу, что superview правильно установлено в viewWillAppear, но не в viewDidLoad.

Я обнаружил, что viewDidLoad вызывается в разное время, например при нажатии pushViewController или при доступе к self.view
У меня есть следующий код, и viewDidLoad вызывается из nil == controller.view.superview.

if (nil == controller.view.superview) {
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView addSubview:controller.view];
}

Так как я не могу получить доступ к суперпредставлению из viewDidLoad, я не могу расположить представление так, как я это делал ранее в viewDidLoad.Это кажется таким неудобным и излишне сложным.
Любое предложение, пожалуйста?

Ответы [ 2 ]

10 голосов
/ 09 ноября 2010

Свойство superview равно nil, пока ваше представление не будет добавлено в качестве подпредставления.В общем, вы не можете знать, что будет суперпредставление в методе loadView.

Вы можете использовать свойства авторазмера, как предложено Costique.Посмотрите Изменение размера подпредставлений в официальных документах UIView .

Вы также можете установить кадр после вызова на loadView, например, примерно так:

MyViewController *myController = [[MyViewController alloc] init];
myController.view.frame = window.bounds;
[window addSubview:myController.view];

Кстати, обычно безопаснее использовать свойство родительского элемента bounds для фрейма подпредставления.Это связано с тем, что границы родителя находятся в той же системе координат, что и кадр подпредставления, но рамка родителя может отличаться.Например:

UIView *parentView = /* set up this view */;
UIView *subView = /* set up subview */;
[parentView addSubview:subView];
parentView.frame = CGRectMake(30, 50, 10, 10);
subView.frame = subView.superview.frame;  // BAD!!!
// Right now subView's offset is (30, 50) within parentView.
subView.frame = subView.superview.bounds;  // Better.
// Now subView is in the same position/size as its parent.
7 голосов
/ 09 ноября 2010

Просто установите маску авторазмера, и навигационный контроллер сделает все остальное:

myView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...