Как правило, неплохо смешивать фреймы с Auto Layout. (Исключение представляет собой иерархию представлений, которая использует ограничения, содержащие неотображение, которое затем не использует никаких ограничений с этой точки вниз [и дополнительных оговорок]). Одна из больших проблем заключается в том, что система ограничений обычно не получает никакой информации из setFrame.
Другое эмпирическое правило заключается в том, что setFrame и традиционное дерево макета вычисляются до системы ограничений. Это может показаться интуитивно понятным с первой частью, но помните, что 1) в традиционном дереве макетов представления выкладывают свои подпрограммы, а затем вызывают на них layoutSubviews, поэтому каждый кадр супервизора устанавливается перед тем, как он выйдет, но 2) в система ограничения, он пытается вычислить кадр супервизора из подзонов, снизу вверх. Но после получения информации снизу вверх, каждый подзаголовок сообщает информацию, макет работы выполняется сверху вниз.
Куда это вас покидает? Вы правы, что вам нужно установить это программно. В IB нет способа указать, что вы должны переключаться с верхнего уровня на бок о бок. Вот как вы можете это сделать:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomViewToTopConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *rightViewToLeftConstraint;
.
-(void)updateViewConstraints
{
//first remove the constraints
[self.view removeConstraints:@[self.rightViewToLeftConstraint, self.bottomViewToTopConstraint]];
if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
//align the tops equal
self.bottomViewToTopConstraint = [NSLayoutConstraint constraintWithItem:self.bottomRightView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLeftView
attribute:NSLayoutAttributeTop
multiplier:1.0
constant:0];
//align to the trailing edge by spacer
self.rightViewToLeftConstraint = [NSLayoutConstraint constraintWithItem:self.bottomRightView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.topLeftView
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:self.spacer];
} else { //portrait
//right view atached vertically to the bottom of topLeftView by spacer
self.bottomViewToTopConstraint = [NSLayoutConstraint constraintWithItem:self.bottomRightView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:self.topLeftView
attribute:NSLayoutAttributeBottom
multiplier:1.0
constant:self.spacer];
//bottom view left edge aligned to left edge of top view
self.rightViewToLeftConstraint = [NSLayoutConstraint constraintWithItem:self.bottomRightView
attribute:NSLayoutAttributeLeading
relatedBy:NSLayoutRelationEqual
toItem:self.topLeftView
attribute:NSLayoutAttributeLeading
multiplier:1.0
constant:0];
}
[self.view addConstraints:@[self.rightViewToLeftConstraint, self.bottomViewToTopConstraint]];
[super updateViewConstraints];
}
Поскольку вы не можете изменять ограничения после их добавления ( кроме константы), мы должны сделать этот шаг удаления-добавления. Обратите внимание, что те, что в IB, также могут быть заполнителями, поскольку мы удаляем их каждый раз (сначала мы могли проверить). Мы могли бы изменить константу на некоторое значение смещения, например, относящееся к супервизору с помощью spacer + topViewHight + spacer. Но это означает, что когда авто макет идет для расчета этого представления, вы сделали предположения на основе другой информации, которая могла бы измениться. Обмен мнениями и изменение того, что они связывают с факторами, которые должны изменить друг друга.
Обратите внимание, что поскольку Auto Layout будет использовать ограничения при передаче информации вверх, сначала мы их модифицируем, тогда мы называем super. Это вызов частной реализации суперкласса для выполнения вычислений для этого представления, а не для просмотра этого представления в иерархии представлений, хотя на самом деле следующий шаг будет дальше по дереву.
Можно использовать вычисляемые свойства, а не методы, если расчеты не занимают заметного времени
.Я бы оставил их как свойства. Но нет «стандартной» причины делать то или иное дело. Если ты один, делай все, что тебе больше нравится. Если вы в команде, следуйте правилам, которым следуют остальные члены вашей команды.
Иногда вам нужно учитывать и то, что вы моделируете ... В некоторых доменах расчетные значения часто или, как ожидается, будут атрибутом модели - свойством. Если это так, то запишите его как свойство, даже если вычисление совсем не тривиально или немного дороже в вычислении. Просто документируйте это в своем API или реализуйте некоторый механизм кэширования, чтобы минимизировать повторные вычисления для этого свойства.
Я думаю, что все они должны быть свойствами. Пока это не меняет состояние объекта, я круче отношусь к нему как к свойству.
Кроме того, если я использую ваш класс для привязки данных (WPF и т. Д.), То я могу связываться напрямую с вашим свойством без необходимости изменять / расширять класс.
Зависит от того, если ваши «свойства» становятся мамонтами и требуют целого ряда бизнес-логики, они не должны быть свойствами, должен быть метод. Пример, который вы разместили, выглядит вполне нормально. Нет стандартного способа сделать это, следуйте своему инстинкту; если это похоже на то, что нужно много, вам, вероятно, нужен метод.
В любом случае, это в значительной степени просто синтаксический сахар, поэтому вы хотите, чтобы в вашей команде было соглашение или то, что вы предпочитаете, при условии, что он просто возвращает информацию об объекте, а не изменяет его или взаимодействует с другими объектами.
Если они а) легкие и б) не имеют побочных эффектов, я бы сделал их свойства.
Легкий вес, конечно, немного нечеткий, но практическое правило таково: если мне когда-либо придется беспокоиться о вызове свойства (будь то в цикле или где-то еще), возможно, это будет метод.
Если свойство вычислять особенно дорого, я мог бы изменить его на метод GetWhwhat (). Это служит подсказкой для любого, кто использует мой класс, что это значение требует некоторой значительной работы, и вызывающий объект должен кэшировать значение, а не вызывать метод несколько раз.
Тривиальные вычисления идеально подходят внутри свойств.
] Я думаю, что методы должны выполнять действия над объектом, обычно изменяя его состояние. Свойства должны отражать текущее состояние объекта, даже если свойство вычисляется. Поэтому необходимо сохранять свойства IMO. [
]] На мой взгляд, это предпочтение, это то, что ты хочешь сделать. В большинстве случаев я делаю пропретации, если только не задействована логика. Дополнительно, если Вам нужно передать параметры для изменения функциональности, то, очевидно, будет применен метод...[
].MSDN дает информацию об этом здесь
Дизайнеры библиотеки класса часто должны решить между реализацией класса член как свойство или метод. В Общие методы представляют действия и Свойства представляют данные.
Какой из них вы думаете, что это? Деятельность рассчитывает / getLaborcost или данные?
WorkOrder workOrder = new WorkOrder();
workOrder.LaborHours = 8;
workOrder.LaborRate = 20;
decimal cost = workOrder.LaborCost; // This is OK here
Но если вы собираетесь сделать это для того же объекта:
worOrder.LaborHours = 18;
decimal newCost = workOrder.LaborCost
Теперь это не может быть недвижимостью. Было бы намного лучше быть методом.