IOS: почему я не могу программно установить рамку для кнопки?

Вот странная вещь, но я не мог понять. Я не могу программно установить фрейм для кнопки.

У меня есть кнопка с IBOutlet как beyondViewButton, и я управляю ее перетаскиванием из представления в файл ViewController.m file @interface и @end, а затем @synthesized.

в методе viewDidLoad, я добавил следующее:

   //x = x + widthToUse * 0.25;
   //y += h + 50;
   x = 50; //either hard code x value or set it mathematically, not working
   y = 300;
   w = 200;
   h = 60;
   //[beyondViewButton setFrame:CGRectMake(x, y, w, h)]; //not working 
   beyondViewButton.frame = CGRectMake(x, y, w, h); //not working
   //[beyondViewButton setBackgroundImage:[UIImage imageNamed:@"bgImage.png"] forState:UIControlStateNormal]; //this line actually works
   //[beyondViewButton setTitle:@"iCool!" forState:UIControlStateNormal];
   [beyondViewButton setTitle:@"iShit!" forState:UIControlStateNormal]; //change from iCool to iShit, I can see change
   //[self.view addSubview:beyondViewButton]; //either adding this line or not, both work

Почему я не могу настроить фрейм?

Одна вещь, я не знаю, если уместно, заключается в том, что эта кнопка была настроена в "представлении выбора", который поступает с контроллера навигации и переходит к следующему представлению/сцене. Когда эта кнопка нажата, приложение переходит из "представления выбора" в следующий вид - это было реализовано через раскадровку. Я еще не освоил раскадровку, и у меня много неуверенности.

Может ли кто-нибудь пролить свет на это? Спасибо!!

Дополнительная информация о диагнозе: Я проверил button.description до и после того, как я установил код кадра:

     2012[25830:12503] beyond button <UIRoundedRectButton: 0x8821cd0; frame = (0 0; 0 0); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x8821da0>>

что до и после после. Интересно, что значения фрейма не то, что я задал, как в приведенном здесь коде, у меня есть x = 50, y = 300, w = 200, h = 60, а в описании NSLog - x = 190, y = 345, w = 110, h = 94, что находится вокруг позиции, которую я видел во время выполнения. Это значения, которые я установил в раскадровке.

     2012[25830:12503] beyond button <UIRoundedRectButton: 0x8821cd0; frame = (190 345; 110 94); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x8821da0>>

Если я прокомментировал заданные строки кадра кода, когда я проверяю описание кнопки, до и после настроек кнопки, я получил 0,0,0,0 в качестве рамки кнопки --- хотя я вижу кнопки в нижней половине представления. Другим словом, строка установочного фрейма работает НЕКОТОРЫМ ПУТЕМ, но не так, как я хотел. Это просто значения раскадровки, но не те, которые я задал с помощью x, y, w, h.

Ответ 1

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

Ответ 2

Если в конструкторе интерфейса включена автоматическая компоновка, вы также можете удалить кнопку из представления, ее размер, а затем снова добавить. Вид гетто, но он работает.

Нечто похожее на это...

[self.myButton removeFromSuperview];
[self.myButton setTranslatesAutoresizingMaskIntoConstraints:YES];
[self.myButton sizeToFit];
[self.myView addSubview:self.myButton];

Ответ 3

При работе с кнопкой, которая была добавлена ​​с помощью Autolayout, у меня были проблемы с размером.

Добавление ниже строки работало хорошо для меня,

self.button.sizeToFit()
self.button.transform = CGAffineTransform(scaleX: 1, y: 1)

Примечание. Я также делал анимацию анимации поворота кнопки.