| Paste number 50155: | Core Animation layout |
| Pasted by: | annodomini |
| When: | 1 year, 8 months ago |
| Share: | Tweet this! | http://paste.lisp.org/+12P7 |
| Channel: | #macdev |
| Paste contents: |
require 'osx/cocoa'
OSX.require_framework 'QuartzCore'
class FancyRubyView < OSX::NSView
include OSX
def initWithFrame(frame)
super_initWithFrame(frame)
# Initialization code here.
return self
end
def awakeFromNib
puts "Awaking from nib"
setup_layers
end
def setup_root_layer
self.window.makeFirstResponder(self)
# self.window.setAcceptsMouseMovedEvents(true)
@root_layer = CALayer.layer
self.setLayer(@root_layer)
self.setWantsLayer(true)
@root_layer.layoutManager = CAConstraintLayoutManager.layoutManager
puts "Created root layer #{@root_layer}"
puts "Root layer frame: #{rect_as_string(@root_layer.frame)}"
end
def setup_foo_layer
@foo_layer = CATextLayer.layer
@foo_layer.string = "Foobar"
@foo_layer.fontSize = 32
@foo_layer.foregroundColor = CGColorCreateGenericRGB(0,0,1.0,1.0)
@foo_layer.name = "foobar"
# Works fine if I use manual placement and manually setup the bounds
#@foo_layer.position = NSPoint.new(100, 100)
#@foo_layer.bounds = NSRect.new(0, 0, 100, 40)
puts "Created text layer: #{@foo_layer}"
end
def setup_baz_layer
@baz_layer = CATextLayer.layer
@baz_layer.string = "Baz"
@baz_layer.fontSize = 32
@baz_layer.foregroundColor = CGColorCreateGenericRGB(1,0,0,1)
@baz_layer.position = NSPoint.new(100, 200)
@baz_layer.bounds = NSRect.new(0, 0, 60, 40)
@baz_layer.name = "baz"
end
def setup_constraints
# This works no matter what the other constraint is:
@foo_layer.addConstraint(
CAConstraint.constraintWithAttribute_relativeTo_attribute(
KCAConstraintMidX, "superlayer", KCAConstraintMidX
)
)
# This works:
#@foo_layer.addConstraint(
# CAConstraint.constraintWithAttribute_relativeTo_attribute(
# KCAConstraintMidY, "superlayer", KCAConstraintMidY
# )
#)
# This doesn't:
@foo_layer.addConstraint(
CAConstraint.constraintWithAttribute_relativeTo_attribute(
KCAConstraintMidY, "baz", KCAConstraintMidY
)
)
# Nor does this:
#@foo_layer.addConstraint(
# CAConstraint.constraintWithAttribute_relativeTo_attribute_offset(
# KCAConstraintMaxY, "baz", KCAConstraintMinY, -10
# )
#)
end
def setup_layers
setup_root_layer
setup_foo_layer
setup_baz_layer
setup_constraints
@root_layer.addSublayer(@foo_layer)
@root_layer.addSublayer(@baz_layer)
@root_layer.layoutIfNeeded
puts "Foo layer frame: #{rect_as_string(@foo_layer.frame)}"
end
def rect_as_string(frame)
"rect(#{frame.origin.x}, #{frame.origin.y}, #{frame.size.width}, #{frame.size.height})"
end
def point_from_event(event)
event_loc = event.locationInWindow
self.convertPoint_fromView_(event_loc, nil)
end
# def mouseMoved(event)
# @foo_layer.position = point_from_event(event)
# end
def mouseDown(event)
@baz_layer.position = point_from_event(event)
end
end
This paste has no annotations.