C # только для чтения вычисляемых свойств, они должны быть методами?

Как правило, неплохо смешивать фреймы с Auto Layout. (Исключение представляет собой иерархию представлений, которая использует ограничения, содержащие неотображение, которое затем не использует никаких ограничений с этой точки вниз [и дополнительных оговорок]). Одна из больших проблем заключается в том, что система ограничений обычно не получает никакой информации из setFrame.

Другое эмпирическое правило заключается в том, что setFrame и традиционное дерево макета вычисляются до системы ограничений. Это может показаться интуитивно понятным с первой частью, но помните, что 1) в традиционном дереве макетов представления выкладывают свои подпрограммы, а затем вызывают на них layoutSubviews, поэтому каждый кадр супервизора устанавливается перед тем, как он выйдет, но 2) в система ограничения, он пытается вычислить кадр супервизора из подзонов, снизу вверх. Но после получения информации снизу вверх, каждый подзаголовок сообщает информацию, макет работы выполняется сверху вниз.


Фиксация

Куда это вас покидает? Вы правы, что вам нужно установить это программно. В IB нет способа указать, что вы должны переключаться с верхнего уровня на бок о бок. Вот как вы можете это сделать:

  1. Выберите одно из поворота и убедитесь, что все ограничения настроены так, как вы хотите, в построителе интерфейса - например, каждый цветной вид помещает 8 точек (ваш spacer view) от супервизора. Кнопки «clear constraints» и «update frames» внизу помогут вам, и вы захотите часто щелкнуть по нему, чтобы убедиться, что он синхронизирован.
  2. Очень важно, чтобы вид сверху слева был подключен к надзору левой (верхней) и верхней сторонами, а нижний правый - только правой (задней) и нижней сторонами. Если вы очистите размеры, задающие высоту и ширину, это приведет к предупреждению. нормальный, и в этом случае можно решить, установив при необходимости равные ширины и «равные высоты» и часть шага 3. (Обратите внимание, что константа должна быть равна нулю, чтобы значения были действительно равными.) В других случаях мы должны положить ограничение и отметьте его «заполнителем», чтобы заставить замолчать компилятор, если мы уверены, что будем заполнять информацию, но компилятор этого не знает.
  3. Определить (или создать) два ограничения, которые связывают правый / нижний вид на что-то слева и сверху. Возможно, вы захотите использовать браузер объектов слева от IB. Crea те два выхода в viewController.h с помощью помощника редактора. Будет выглядеть так: @property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomViewToTopConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *rightViewToLeftConstraint;
  4. Внедрить updateConstraints в viewController. Вот где логика будет идти:

.

-(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. Это вызов частной реализации суперкласса для выполнения вычислений для этого представления, а не для просмотра этого представления в иерархии представлений, хотя на самом деле следующий шаг будет дальше по дереву.

41
задан Marcel Gosselin 8 January 2010 в 20:51
поделиться

11 ответов

Можно использовать вычисляемые свойства, а не методы, если расчеты не занимают заметного времени

См. Рекомендации по использованию свойства

.
54
ответ дан Thomas Levesque 8 January 2010 в 20:51
поделиться

Я бы оставил их как свойства. Но нет «стандартной» причины делать то или иное дело. Если ты один, делай все, что тебе больше нравится. Если вы в команде, следуйте правилам, которым следуют остальные члены вашей команды.

1
ответ дан Billy ONeal 8 January 2010 в 20:51
поделиться

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

0
ответ дан Mark Menchavez 8 January 2010 в 20:51
поделиться

Я думаю, что все они должны быть свойствами. Пока это не меняет состояние объекта, я круче отношусь к нему как к свойству.

Кроме того, если я использую ваш класс для привязки данных (WPF и т. Д.), То я могу связываться напрямую с вашим свойством без необходимости изменять / расширять класс.

7
ответ дан Tim Ridgely 8 January 2010 в 20:51
поделиться

Зависит от того, если ваши «свойства» становятся мамонтами и требуют целого ряда бизнес-логики, они не должны быть свойствами, должен быть метод. Пример, который вы разместили, выглядит вполне нормально. Нет стандартного способа сделать это, следуйте своему инстинкту; если это похоже на то, что нужно много, вам, вероятно, нужен метод.

0
ответ дан JonH 8 January 2010 в 20:51
поделиться

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

0
ответ дан Paul Creasey 8 January 2010 в 20:51
поделиться

Если они а) легкие и б) не имеют побочных эффектов, я бы сделал их свойства.

Легкий вес, конечно, немного нечеткий, но практическое правило таково: если мне когда-либо придется беспокоиться о вызове свойства (будь то в цикле или где-то еще), возможно, это будет метод.

3
ответ дан Michael Stum 8 January 2010 в 20:51
поделиться

Если свойство вычислять особенно дорого, я мог бы изменить его на метод GetWhwhat (). Это служит подсказкой для любого, кто использует мой класс, что это значение требует некоторой значительной работы, и вызывающий объект должен кэшировать значение, а не вызывать метод несколько раз.

Тривиальные вычисления идеально подходят внутри свойств.

0
ответ дан Joel Mueller 8 January 2010 в 20:51
поделиться
[

] Я думаю, что методы должны выполнять действия над объектом, обычно изменяя его состояние. Свойства должны отражать текущее состояние объекта, даже если свойство вычисляется. Поэтому необходимо сохранять свойства IMO. [

]
15
ответ дан 26 November 2019 в 23:42
поделиться
[

] На мой взгляд, это предпочтение, это то, что ты хочешь сделать. В большинстве случаев я делаю пропретации, если только не задействована логика. Дополнительно, если Вам нужно передать параметры для изменения функциональности, то, очевидно, будет применен метод...[

].
0
ответ дан 26 November 2019 в 23:42
поделиться

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 

Теперь это не может быть недвижимостью. Было бы намного лучше быть методом.

0
ответ дан 26 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: