IOS дает неожиданное значение ширины в версиях IOS7 и IOS8

Привет, я разрабатываю приложение для iOS. В моем приложении я проверяю значения высоты и ширины X и Y моего представления. В IB я использую автоматический макет с правым левым верхом и ограничениями по высоте. Я не указываю ограничения ширины. Внутри viewDidLoad я проверяю значения для ширины, высоты X и Y. Для значения ширины это дает неожиданное значение на IOS8, но на IOS7 оно дает правильное значение. для IOS7 он дает ширину 320, которая ожидается, а для IOS8 - 600, чего не ожидается.

NSLog(@"%f %f %f %f ", _sampleView.frame.size.height, _sampleView.frame.size.width, _sampleView.frame.origin.x,
       _sampleView.frame.origin.y);

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

 UIView *subView = [[UIView alloc] init];
subView.frame = _sampleView.frame;
[self.view addSubview:subView];

Вышеупомянутая вещь отлично работает на IOS7, но не на IOS8.

Как решить эту проблему. Я что-то не так делаю? Нужна помощь. Спасибо.


person nilkash    schedule 29.12.2014    source источник
comment
Вы создали проект с XCOde 6 и более поздними версиями, в iOS 8 Apple представила класс размера, а высота ширины UIView - 600, также ее нельзя изменить ...   -  person Krunal Darji    schedule 29.12.2014
comment
затем как получить правильный размер во время выполнения в таком случае.   -  person nilkash    schedule 29.12.2014
comment
Второй вид, который вы добавляете поверх представления uiviewcontroller, только ... добавить в _sampleview addubview: subview   -  person Krunal Darji    schedule 29.12.2014
comment
попробуйте зарегистрировать размеры в viewWillAppear, в viewDidLoad он имеет размер, указанный в раскадровке, я думаю, и правильный размер применяется позже, после того, как он добавлен в иерархию представлений.   -  person wirrwarr    schedule 29.12.2014
comment
Но в моем случае я не хочу включать его в свой _sampleview. Я хочу сам добавить его в главное представление.   -  person nilkash    schedule 29.12.2014
comment
@wirrwarr дает те же значения в viewdidload, а также в методе viewwillappear   -  person nilkash    schedule 29.12.2014
comment
это странно, поскольку на этом этапе все представления должны иметь окончательные размеры. Похоже, у вас есть код, который после этого меняет рамки / ограничения.   -  person wirrwarr    schedule 30.12.2014
comment
Да, у меня есть такой код. Но даже несмотря на то, что я не выполняю этот код, он все же дает мне эти значения. Я буду отлаживать больше и сообщу вам.   -  person nilkash    schedule 31.12.2014


Ответы (1)


В Xcode 6 раскадровки начинаются с размера экрана 600x600, поэтому в viewDidLoad, поскольку размеры представлений еще не были изменены в соответствии с размером экрана, вы все равно получаете этот размер.

Если вы хотите узнать размер элементов на экране, вам необходимо посмотреть на них после того, как они были правильно размещены и изменены на экране. Вы можете проверить это на viewDidLayoutSubviews вашего контроллера представления.

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];

    NSLog(@"%f %f %f %f ", _sampleView.frame.size.height, _sampleView.frame.size.width, _sampleView.frame.origin.x, _sampleView.frame.origin.y);
}

Однако вам не следует добавлять какие-либо подвиды в этот метод, так как он снова сработает при размещении только что добавленного представления, вызывая бесконечный цикл. Используйте его только для определения правильного размера ваших представлений.

Если вы действительно хотите добавить представление для этого метода, используйте логическое значение элемента управления или что-то в этом роде, чтобы убедиться, что вы делаете это только один раз.

Если вы хотите добавить представление более правильным способом, вы можете программно добавить некоторые ограничения автоматического размещения в это новое представление, которое вы добавляете, чтобы убедиться, что оно ведет себя как исходное.

Обратитесь к этой статье, чтобы узнать, как программно использовать автоопределение: http://www.thinkandbuild.it/learn-to-love-auto-layout-programmatically/

person manecosta    schedule 29.12.2014
comment
спасибо за ваш повтор. Я попробую ваше решение и дам знать. Это правильный способ справиться с этой ситуацией? - person nilkash; 30.12.2014
comment
В некоторых случаях я получаю правильное значение, но в некоторых случаях я все еще получаю значение 600 внутри представления DidLayoutSubViews. - person nilkash; 30.12.2014
comment
Это странно, я был уверен, что вы всегда будете получать измененные значения с помощью этого метода. Вы всегда можете выбрать опцию автоматического размещения, где вы добавляете представление и устанавливаете ограничения, чтобы оно вело себя как исходное представление, которое у вас уже было. - person manecosta; 30.12.2014