Может ли изменение свойства вызвать метод?

Может кто-нибудь объяснить мне, почему в iOS

 var dx = (touchPoint.x - dragTouch.x) * self.transform.a
 var dy = (touchPoint.y - dragTouch.y) * self.transform.d

 self.transform.tx = self.transform.tx + dx 
 self.transform.ty = self.transform.ty + dy

 if ( self.frame.origin.y > 70){ // lock upper edge during drag
       self.frame.origin.y = 70
 }

отличается от

 var dx = (touchPoint.x - dragTouch.x) * self.transform.a
 var dy = (touchPoint.y - dragTouch.y) * self.transform.d

 if ( self.frame.origin.y > 70){ // lock upper edge during drag
       self.frame.origin.y = 70
 }

 self.transform.tx = self.transform.tx + dx 
 self.transform.ty = self.transform.ty + dy

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

Вы знаете, как я могу избежать этой проблемы?

2 ответа

Как сказал @HotLicks, вероятно, что-то происходит в фоновом режиме. Поскольку мы не знаем деталей реализации, сложно сказать с уверенностью.

  • Вариант №1 будет таким, как сказал @HotLicks:
    В этом сценарии есть private собственность, к которой вы можете получить доступ только через get и / или set в другом, public компьютерная собственность.
  • Вариант № 2 будет почти таким же:
    Возможно, что собственность имеет willSet и / или didSet наблюдатели за недвижимостью. Это был бы другой подход к тому же принципу, что и в варианте № 1.

Вы, вероятно, не можете избежать этого. Но вы, вероятно, не должны пытаться либо. Обычно есть причина, почему реализация такая, какая она есть. И иметь отдельный get/set или наблюдатели свойств - это метод ограничения ваших (программистских) действий таким образом, чтобы они подходили к данной среде.

Спасибо, думаю, я решил проблему. В документации говорится, что каждый раз, когда изменяется свойство фрейма, вызываются такие методы, как setNeedsUpdateConstraints(), и это вызывает перерисовку макета. Я решил избегать прямого изменения свойств фрейма, изменяя только dx и dy.

Другие вопросы по тегам