Создание внутренней тени в UIView

Я хотел бы создать внутреннюю тень на моем UIView на iPad следующим образом:

UIView with shadow

Этот UIView может изменить размер, поэтому я не могу использовать простой образ для создания теневой тени.

Я тестировал с помощью setShadow и т.д., но это только созданный dropshadow.

Любая идея, как создать такую ​​тень?

Ответ 1

Создайте тень как прозрачный слой определенного размера, затем создайте растяжимое изображение, например:

UIImage *shadowImage = [UIImage imageNamed:@"shadow.png"];
shadowImage = [shadowImage stretchableImageWithLeftCapWidth:floorf(shadowImage.size.width/2) topCapHeight:floorf(shadowImage.size.height/2)];

Затем вы можете поместить это как изображение в UIImageView с масштабом contentMode, чтобы оно поместилось, и оно будет работать так, как вы хотите.

Допустим, ваше мнение называется "myView". Вы можете добавить тень следующим образом:

UIImageView *shadowImageView = [[UIImageView alloc] initWithImage:shadowImage];
shadowImageView.contentMode = UIViewContentModeScaleToFill;
shadowImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
shadowImageView.frame = myView.bounds;
[myView addSubview:shadowImageView];
[shadowImageView release]; // only needed if you aren't using ARC

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

Ответ 3

Этот вопрос уже частично ответил в fooobar.com/info/20315/...

view.layer.masksToBounds = NO;
view.layer.cornerRadius = 8; // if you like rounded corners
view.layer.shadowRadius = 5;
view.layer.shadowOpacity = 0.5;
CGFloat indent = 10;
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent);
view.layer.shadowPath = [UIBezierPath bezierPathWithRect:innerRect].CGPath;

Играйте с переменными до тех пор, пока они не соответствуют вашему теневому стилю.

UPDATE

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

CGFloat indent = 10;
CGRect innerRect = CGRectMake(indent,indent,view.frame.size.width-2*indent,view.frame.size.height-2*indent);
UIView * shadowView = [[UIView alloc] initWithFrame:innerRect];
shadowView.backgroundColor = [UIColor clearColor];
shadowView.layer.masksToBounds = NO;
shadowView.layer.cornerRadius = 8; // if you like rounded corners
shadowView.layer.shadowRadius = 5;
shadowView.layer.shadowOpacity = 0.5;
shadowView.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowView.bounds].CGPath;
[view addSubview:shadowView];
[shadowView release];