Ask and he shall receive. It's not perfect, yet. There are some clipping problems I can't figure out.
# coding: utf-8
from objc_util import *
import ui
UIColor = ObjCClass('UIColor')
def Color(red=0, green=0, blue=0, alpha=1):
return UIColor.colorWithRed_green_blue_alpha_(red, green, blue, alpha)
class ShadowView (ui.View):
def __init__(self, *args, **kwargs):
super(ShadowView, self).__init__()
self.pntr = ObjCInstance(self)
self.pntr.layer().setMasksToBounds_(False) ## Go ahead and do this.
@property
def corner_radius(self):
return self.pntr.layer().cornerRadius()
@corner_radius.setter
def corner_radius(self, val):
self.pntr.layer().setCornerRadius_(val)
@property
def border_color(self):
return self.pntr.layer().borderColor()
@border_color.setter
def border_color(self, color):
self.pntr.layer().setBorderColor_(Color(*color).CGColor())
@property
def border_width(self):
return self.pntr.layer().borderWidth()
@border_width.setter
def border_width(self, val):
self.pntr.layer().setBorderWidth_(val)
@property
def opacity(self):
return self.pntr.layer().opacity()
@opacity.setter
def opacity(self, val):
self.pntr.layer().setOpacity_(value)
@property
def hidden(swlf):
return self.pntr.layer().hidden()
@hidden.setter
def hidden(self, val):
self.pntr.layer().setHidden_(val)
@property
def masks_to_bounds(self):
return self.pntr.layer().masksToBounds()
@masks_to_bounds.setter
def masks_to_bounds(self, val):
self.pntr.layer().setMasksToBounds_(val)
@property
def mask(self):
return self.pntr.layer().mask()
@mask.setter
def mask(self, new_mask):
self.pntr.layer().setMask_(new_mask)
@property
def double_sided(self):
return self.pntr.layer().doubleSided()
@double_sided.setter
def double_sided(self, val):
self.pntr.layer().setDoubleSided_(val)
@property
def shadow_opacity(self):
return self.pntr.layer().shadowOpacity()
@shadow_opacity.setter
def shadow_opacity(self, val):
self.pntr.layer().setShadowOpacity_(val)
@property
def shadow_radius(self):
return self.pntr.layer().shadowRadius()
@shadow_radius.setter
def shadow_radius(self, val):
self.pntr.layer().setShadowRadius_(val)
@property
def shadow_offset(self):
return self.pntr.layer().shadowOffset()
@shadow_offset.setter
def shadow_offset(self, offset):
## offset should be a tuple, but I'll take a CGSize
if isinstance(offset, CGSize):
self.pntr.layer().setShadowOffset_(offset)
elif isinstance(offset, tuple):
self.pntr.layer().setShadowOffset_(CGSize(*offset))
else:
raise TypeError("Cannot use type %s. Use CGSize or tuple" % type(offset))
@property
def shadow_color(self):
return self.pntr.layer().shadowColor()
@shadow_color.setter
def shadow_color(self, color):
if isinstance(color, UIColor.CGColor()):
self.pntr.layer().setShadowColor_(color)
elif isinstance(color, tuple) and len(color) == 4:
self.pntr.layer().setShadowColor_(Color(*color).CGColor())
else:
raise ValueError('Cannot use type %s. Use UIColor or tuple' % type(color))
@property
def shadow_path(self):
return self.pntr.layer().shadowPath()
@shadow_path.setter
def shadow_path(self, path):
self.pntr.layer().setShadowPath_(path)
@property
def style(self):
return self.pntr.layer().style()
@style.setter
def style(self, style):
self.pntr.layer().setStyle_(style)
if __name__ == '__main__':
view = ui.View(frame=(0,0,500,500))
box = ShadowView(frame=(0,0,100,100))
view.background_color = 'white'
box.background_color = 'red'
box.center = view.center
view.add_subview(box)
box.masks_to_bounds = False
box.corner_radius = 6.
box.border_color = (0,1,0)
box.border_width = 6
box.shadow_radius = 10
box.shadow_offset = (0,0)
box.shadow_opacity = 1
view.present('sheet')
I tested most of it, but there may still be some funny-ness.
B.