Создание внутренней тени в 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
Вы также можете сделать большую часть этого в построителе интерфейса, если хотите, до тех пор, пока вы создаете само растягиваемое изображение в коде.
Ответ 2
Вы можете найти это полезным, я создал для него категорию UIView
https://github.com/Seitk/UIView-Shadow-Maker
Ответ 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];