iOS AutoLayout-получить ширину размера кадра
Я разрабатываю с помощью iOS 6 auto layout
Я хотел бы записать сообщение, отображающее ширину кадра представления.
Я вижу textView на экране.
но я получаю ширину и высоту как ноль, я что-то упустил ?
NSLog(@"textView = %p", self.textView);
NSLog(@"height = %f", self.textView.frame.size.height);
NSLog(@"width = %f", self.textView.frame.size.width);
textView = 0x882de00
height = 0.000000
width = 0.000000
9 ответов:
Я думаю, что у auto layout не было времени для компоновки ваших представлений к тому времени, когда вы это называете. Авто макет не произошло к тому времени
viewDidLoadвызывается, потому что он вызывается сразу после загрузки представлений, и только после этого представления помещаются в иерархию представлений контроллера представления и в конечном итоге выкладываются (в представленииlayoutSubviewsметод).Edit: этот ответ указывает, почему сценарий в вопросе не работает. @dreamzor это указывает где разместить свой код, чтобы решить.
на самом деле, выше ответы не совсем правильно. Я следовал за ними и получал нули снова и снова.
хитрость заключается в том, чтобы поместить ваш фрейм-зависимый код в
viewDidLayoutSubviewsметод, которыйуведомляет контроллер вида, что его представление только что выложило свои подвиды.
Не забывайте, что этот метод вызывается несколько раз и не является частью жизненного цикла ViewController, поэтому будьте осторожны при использовании этого.
надеюсь, что это будет полезно для кого-то.
просто хотел добавить, что для моей программы без ландшафтного режима не использовать автоматическую компоновку намного проще... Я пытался, хотя =D
решение
- поместите этот код в
viewDidAppearпричина
viewDidLoadпроисходит до завершения автозапуска. Таким образом, позиция еще не установлена autolayout, который был указан в xibviewDidAppearпроисходит после завершения автозапуска.
включить в ваш viewDidLoad ()
self.view.setNeedsLayout() self.view.layoutIfNeeded()перед доступом к yourview.рамка.размер.ширина
на самом деле мне удалось силу обновление макета перед моим кодом в пределах
viewDidLoad:override func viewDidLoad() { super.viewDidLoad() println("bounds before \(self.previewContainer.bounds)"); //on iPhone 6 plus -> prints bounds before (0.0,0.0,320.0,320.0) self.view.setNeedsLayout() self.view.layoutIfNeeded() println("bounds after \(self.previewContainer.bounds)"); //on iPhone 6 plus -> prints bounds after (0.0,0.0,414.0,414.0) //Size dependent code works here self.create() }обновление: кажется, это больше не работает
это действительно странная особенность. Но я нашел:
Если вы хотите получить кадр без использования метода layoutsubviews, используйте этот:
dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"View frame: %@", NSStringFromCGRect(view.frame)); });Это действительно странно!!!
ни один из приведенных выше ответов не работал полностью для меня, кроме
viewDidLoadно это имеет побочный эффект не отображать то, что я хочу, пока вид не анимируется, что выглядит плохо.
viewDidLayoutSubviewsдолжны будьте правильным местом для запуска кода, который зависит от завершения автозапуска, но, как указывали другие, он вызывается несколько раз в последних версиях iOS, и вы не можете знать, какой из них является окончательным вызовом.поэтому я решил это с помощью небольшой взлом. В моей раскадровке,
mySubviewдолжно быть меньше, чем его содержащихself.view. Но когдаviewDidLayoutSubviewsпрежде всего,mySubviewвсе еще имеет ширину 600, тогда какself.viewкажется, правильно установлен (это проект iPhone). Поэтому все, что мне нужно сделать, это отслеживать последующие вызовы и проверять относительную ширину. Один разmySubviewменьше, чемself.viewЯ могу быть уверен, что он правильно изложил.override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if self.mySubview.bounds.size.width < self.view.bounds.size.width { // mySubview's width became less than the view's width, so it is // safe to assume it is now laid out correctly... } }это имеет преимущество не полагаться на жестко закодированные номера, поэтому он может работать на всех форм-факторах iPhone, например. Конечно, это не может быть панацеей во всех случаях или на всех устройствах, но, вероятно, есть много гениальных способов сделать подобные проверки относительных размеров.
и нет, мы не должны этого делать, но пока Apple не даст нам более надежные обратные вызовы, мы все застряли с ним.
iOS AutoLayout-получить размер кадра ширина
-(void) layoutSubviews{ [self layoutIfNeeded]; //right you code to set frame its will work to get frame and set frame. CALayer *bottomBorder = [CALayer layer]; bottomBorder.frame = CGRectMake(0.0f, bkView.frame.size.height - 1, bkView.frame.size.width, 1.0f); bottomBorder.backgroundColor = [UIColor blackColor].CGColor; [bkView.layer addSublayer:bottomBorder]; }
вы можете узнать размер только после первого прохода макета. Или просто вызовите метод ниже, а затем после того, как вы получили фактическую ширину вашего представления.
[yourView layoutIfNeeded];
Comments