Могу ли я настроить CGRect с помощью UIEdgeInsets?

У меня есть CGRect, и я хотел бы отрегулировать его с помощью UIEdgeInsets.

Похоже, что это может быть встроенная функция. Я искал CGRectAdjustByInsets или функции с другим префиксом CGRect…, но ничего не нашел.

Должен ли я кодировать свой собственный?


person Benjohn    schedule 02.01.2015    source источник


Ответы (4)


TL;DR

Swift 4.2 используйте theRect.inset(by: theInsets).

Цель c использовать UIEdgeInsetsInsetRect(theRect, theInsets).

Пример

// CGRectMake takes: left, bottom, width, height.
const CGRect originalRect = CGRectMake(0, 0, 100, 50);

// UIEdgeInsetsMake takes: top, left, bottom, right.
const UIEdgeInsets insets = UIEdgeInsetsMake(10, 10, -20, -20);

// Apply the insets…
const CGRect adjustedRect = UIEdgeInsetsInsetRect(originalRect, insets);

// What's the result?
NSLog(@"%@ inset by %@ is %@", 
      NSStringFromCGRect(originalRect),
      NSStringFromUIEdgeInsets(insets),
      NSStringFromCGRect(adjustedRect));

// Logs out…
// {{0, 0}, {100, 50}} inset by {10, 10, -20, -20} is {{10, 10}, {110, 60}}

Объяснение

  • Положительная вставка перемещает край прямоугольника внутрь (к середине прямоугольника).
  • Отрицательная вставка перемещает край наружу (от середины прямоугольника).
  • Нулевая вставка оставит край в покое.

Расскажи мне больше

Дополнительные полезные функции для работы на CGRects описаны в этом примечании.

person Benjohn    schedule 02.01.2015
comment
Фантастика! Я должен был ожидать, что этот метод существует, но я благодарен, что мне не пришлось его искать! ;-) - person mbm29414; 14.10.2016

2018 ... Swift4

Скажите, что вам нужны границы,

но, например, меньше двух пикселей внизу :

let ei = UIEdgeInsetsMake(0, 0, 2, 0)   // top-left-bottom-right
let smaller = UIEdgeInsetsInsetRect(bounds, ei)

Вот и все.

Если вы предпочитаете писать в одну строку, просто

Снимите два снизу:

let newBounds = UIEdgeInsetsInsetRect(bounds, UIEdgeInsetsMake(0, 0, 2, 0))

Ваше здоровье

person Fattie    schedule 04.04.2017
comment
Необычно то, что Swift 3 также не включил это как функцию в CGRect: rect.insetBy(edgeInset) или что-то в этом роде. - person CIFilter; 07.05.2017
comment
Нет, я имею в виду синтаксис. Вместо того, чтобы быть многословной функцией, она могла бы работать напрямую с CGRect. - person CIFilter; 09.05.2017
comment
Я знаю. Но могло быть. Как и все другие функции CGRect. - person CIFilter; 09.05.2017
comment
на самом деле - ты совершенно прав, Лукас. Например, .union - хороший пример. - person Fattie; 09.05.2017

Еще 2018 ... Swift 4.2

Думаю, новый способ выглядит лучше ...

let newCGRect = oldCGRect.inset(by: UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8))
person bearacuda13    schedule 01.08.2018

person    schedule
comment
Ответы только на код не приветствуются в Stack Overflow, потому что они не объясняют, как это решает проблему. Отредактируйте свой ответ, чтобы объяснить, что делает этот код и как он отвечает на вопрос, чтобы он был полезен OP, а также другим пользователям с аналогичными проблемами. - person FluffyKitten; 07.09.2020