Paste number 50155: Core Animation layout

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:
Raw Source | XML | Display As
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.

Colorize as:
Show Line Numbers

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.