Получить фактические размеры представления iOS

Как мне получить фактические размеры представления или подпредставления, которым я управляю? Например:

UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0,200,100)];
[self addSubview:firstView];

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(10, 20, 230, 120)];
[firstView addSubview:button];

Как видите, мой объект button превышает размеры представления, в которое он добавляется.

С учетом этого (при условии, что в качестве подвидов добавляется много объектов), как я могу определить фактическую ширину и высоту firstView?


person GeorgeBuckingham    schedule 13.02.2013    source источник
comment
Это 230 и 120 соответственно, не понимаю в чем у вас проблема.   -  person    schedule 13.02.2013
comment
firstView.bounds.size.height(width) дает свой размер   -  person Anil Varghese    schedule 13.02.2013
comment
@ H2CO3 это не так, это 240 и 140 из-за положения кнопки x и y. Во всяком случае, вопрос был не в этом. С программными добавлениями подвидов, выходящих за границы целевого представления, можете ли вы вычислить фактические границы исходного UIView?   -  person GeorgeBuckingham    schedule 13.02.2013
comment
@GeorgeBuckingham Вы случайно имеете в виду CGRectIntersection() функция?   -  person    schedule 13.02.2013


Ответы (3)


Если вы хотите, чтобы кнопка имела ту же ширину и высоту, что и firstView, вы должны использовать свойство bounds UIView следующим образом:

UIView *firstView = [[UIView alloc] initWithFrame:CGRectMake(0,0,200,100)];
[self addSubview:firstView];

UIButton *button = [[UIButton alloc] initWithFrame:firstView.bounds];
[firstView addSubview:button];

Чтобы просто получить ширину/высоту firstView, вы можете сделать что-то вроде этого:

CGSize size = firstView.bounds.size;
NSInteger width = size.width;
NSInteger height = size.height;
person Soph    schedule 13.02.2013

Первый вид действительно имеет размер 200 x 100. Однако внутренние виды не обрезаются, если вы не используете clipsToBounds.

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

(На самом деле вычислить полные границы, включая все подпредставления в иерархии, не сложно, просто много работы, которая на самом деле никуда вас не приведет. UIView позволяет представлениям быть больше, чем их контейнеры, но это не обязательно дает любые гарантии того, что будет работать правильно и, вероятно, станет источником ошибок, если ими воспользуются. Причина clipsToBounds, вероятно, заключается в том, что отсечение дорого, но необходимо во время анимации, когда подпредставления могут быть временно перемещены за пределы для целей эффекта прежде чем они будут удалены из поля зрения.)

person Jesper    schedule 13.02.2013

firstview.frame.size.width firstview.frame.size.height

person William Falcon    schedule 13.02.2013
comment
кадр может работать не так хорошо, если представление повернуто... см. stackoverflow.com/questions/5361369/ - person Pirkka Esko; 23.10.2014