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
523   9  

9 ответов:

Я думаю, что у auto layout не было времени для компоновки ваших представлений к тому времени, когда вы это называете. Авто макет не произошло к тому времени viewDidLoad вызывается, потому что он вызывается сразу после загрузки представлений, и только после этого представления помещаются в иерархию представлений контроллера представления и в конечном итоге выкладываются (в представлении layoutSubviews метод).

Edit: этот ответ указывает, почему сценарий в вопросе не работает. @dreamzor это указывает где разместить свой код, чтобы решить.

на самом деле, выше ответы не совсем правильно. Я следовал за ними и получал нули снова и снова.

хитрость заключается в том, чтобы поместить ваш фрейм-зависимый код в viewDidLayoutSubviews метод, который

уведомляет контроллер вида, что его представление только что выложило свои подвиды.

Не забывайте, что этот метод вызывается несколько раз и не является частью жизненного цикла ViewController, поэтому будьте осторожны при использовании этого.

надеюсь, что это будет полезно для кого-то.

просто хотел добавить, что для моей программы без ландшафтного режима не использовать автоматическую компоновку намного проще... Я пытался, хотя =D

решение

  • поместите этот код в viewDidAppear

причина

  • viewDidLoad происходит до завершения автозапуска. Таким образом, позиция еще не установлена autolayout, который был указан в xib
  • viewDidAppear происходит после завершения автозапуска.

включить в ваш 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

    Ничего не найдено.