Разница между frame.size.width и frame.width

Я писал программу на быстрых и только сейчас я заметил, что я могу получить прямой доступ к CGRect Свойства ширины и высоты кадра напрямую, без использования CGSize ширина и высота. То есть теперь я могу написать такой код.

@IBOutlet var myView: UIView!

override func viewDidLoad()
{
    super.viewDidLoad()
    var height = myView.frame.height
    var height1 = myView.frame.size.height
}

В Objective C, когда я пытался написать тот же код, строка height = view.frame.height выдает ошибку. Может кто-нибудь, пожалуйста, скажите мне разницу (если таковые имеются) в этих двух строках кода.

3 ответа

Решение

Я просто посмотрел в CGRect структурная ссылка. В Swift определено расширение, в котором есть члены height а также width, Пожалуйста, посмотрите на код ниже

struct CGRect {
var origin: CGPoint
var size: CGSize
}

extension CGRect {
    ...
    var width: CGFloat { get }
    var height: CGFloat { get }
    ...
}

Так что вы можете напрямую получить height а также width значения из CGRect, Как вы можете видеть, это только getters, так что вы получите ошибку, если попытаетесь установить эти значения, используя view.frame.height = someValue

frame имеет CGRect структура, кроме его width а также height иметь только getters, они могут быть только положительными. Из документации:

Независимо от того, сохраняется ли высота в структуре данных CGRect как положительное или отрицательное число, эта функция возвращает высоту, как если бы прямоугольник был стандартизирован. То есть результат никогда не бывает отрицательным числом.

Тем не мение, size имеет CGSize состав, из документации:

Структура CGSize иногда используется для представления вектора расстояния, а не физического размера. Как вектор, его значения могут быть отрицательными. Чтобы нормализовать структуру CGRect так, чтобы ее размер был представлен положительными значениями, вызовите стандартизированную функцию.

Так что разница очевидна.

В Objective C, когда я пытался написать тот же код, строка height = view.frame.height выдает ошибку. Может кто-нибудь, пожалуйста, скажите мне разницу (если таковые имеются) в этих двух строках кода.

CGGeometry.h определяет несколько типов, среди которых C struct CGRect, Эта структура имеет два члена: происхождение и размер.

Это все, что вы можете получить в C (и Objective-C), используя точечные обозначения. Ни C, ни Objective-C не предлагают расширения для структур.

Swift импортирует тип в виде структуры Swift. Разница в том, что Swift позволяет расширять структуры. Таким образом, он предоставляет несколько бесплатных функций C в качестве расширений:

CGRectGetMinX() — CGRect.minX
CGRectGetMidX() — CGRect.midX
CGRectGetMaxX() — CGRect.maxX
CGRectGetWidth() — CGRect.width
[... same for y]

Эти функции C существуют с незапамятных времен - они просто живут в пыльном уголке CoreGraphics.

Они весьма полезны, но вы должны знать их семантику (которая немного отличается от стандартных методов доступа): они нормализуют размеры.

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

let rect = CGRect(x: 0, y: 0, width: 10, height: -10)
assert(rect.width == rect.size.width)   // OK
assert(rect.height == rect.size.height) // boom
Другие вопросы по тегам