Class: MotionPrime::LabelDrawElement

Inherits:
DrawElement show all
Includes:
DrawBackgroundMixin, ElementContentTextMixin, ElementTextMixin
Defined in:
motion-prime/elements/draw/label.rb

Instance Attribute Summary

Attributes inherited from BaseElement

#name, #options, #screen, #section, #styles, #view, #view_class, #view_name

Instance Method Summary collapse

Methods included from DrawBackgroundMixin

#draw_background_in_context

Methods included from ElementTextMixin

#attributed_string, #extract_attributed_string_options, #html_string

Methods included from ElementContentTextMixin

#attributed_text?, #attributed_text_for_text, #cached_content_height, #cached_content_width, #content_font, #content_height, #content_text, #content_width, #current_attributed_text, #height_for_attributed_text, #height_for_text, #multiline_content_width, #width_for_attributed_text, #width_for_text

Methods inherited from DrawElement

#bind_gesture, #computed_frame, factory, #hide, #on_container_render, #render!, #rerender!, #show, #view

Methods included from ElementContentPaddingMixin

#cached_content_outer_height, #cached_content_outer_width, #content_outer_height, #content_outer_width, #content_padding_bottom, #content_padding_height, #content_padding_left, #content_padding_right, #content_padding_top, #content_padding_width

Methods included from FrameCalculatorMixin

#calculate_frame_for

Methods inherited from BaseElement

#add_target, after_render, before_render, #bind_gesture, #cell_element?, #cell_section?, #compute_options!, #computed_options, #dealloc, factory, #hide, #initialize, #notify_section_after_render, #notify_section_before_render, #reload!, #render, #render!, #rerender!, #show, #update, #update_options, #update_with_options

Methods included from HasClassFactory

#camelize_factory, #class_factory, #low_camelize_factory, #underscore_factory

Methods included from HasStyleOptions

#extract_font_from

Methods included from HasStyleChainBuilder

#build_styles_chain

Methods included from HasNormalizer

#debug_info, #element?, #normalize_object, #normalize_options, #normalize_value

Constructor Details

This class inherits a constructor from MotionPrime::BaseElement

Instance Method Details

#default_padding_for(side) ⇒ Object



87
88
89
90
# File 'motion-prime/elements/draw/label.rb', line 87

def default_padding_for(side)
  return super unless side.to_s == 'top'
  @padding_top || 0
end

#draw_in(rect) ⇒ Object



42
43
44
# File 'motion-prime/elements/draw/label.rb', line 42

def draw_in(rect)
  draw_in_context(UIGraphicsGetCurrentContext())
end

#draw_in_context(context) ⇒ Object

using hack for bug described here: stackoverflow.com/questions/19232850/nsattributedstring-drawinrect-disappears-when-the-frame-is-offset TODO: check it in iOS 7.1 and remove CGContext manuplations (pass innerRect/topLeftCorner) if fixed



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'motion-prime/elements/draw/label.rb', line 48

def draw_in_context(context)
  return if computed_options[:hidden]
  size_to_fit_if_needed
  set_text_position

  draw_background_in_context(context)

  UIGraphicsPushContext(context)
  options = draw_options
  if options[:is_html] || options[:line_spacing] ||
    options[:line_height] || options[:underline] || options[:force_attributed]
    prepared_text = options[:is_html] ? html_string(options) : attributed_string(options)

    CGContextSaveGState(context)
    if options[:inner_rect]
      rect = options[:inner_rect]
      CGContextTranslateCTM(context, *rect.origin.to_a)
      prepared_text.drawInRect(CGRectMake(0, 0, *rect.size.to_a))
    else
      CGContextTranslateCTM(context, *options[:top_left_corner].to_a)
      prepared_text.drawAtPoint(CGPointMake(0, 0))
    end
    CGContextRestoreGState(context)
  else
    # regular string
    prepared_text = options[:text]
    options[:text_color].set
    if options[:inner_rect]
      prepared_text.drawInRect(options[:inner_rect],
        withFont: options[:font],
        lineBreakMode: options[:line_break_mode],
        alignment: options[:text_alignment])
    else
      prepared_text.drawAtPoint(options[:top_left_corner], withFont: options[:font])
    end
  end
  UIGraphicsPopContext()
end

#draw_optionsObject



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'motion-prime/elements/draw/label.rb', line 8

def draw_options
  options = computed_options
  text = (options[:html] || options[:text]).to_s.gsub(/\A[\n\r]+/, '')
  text_color = (options[:text_color] || :black).uicolor
  font = (extract_font_from(options) || :system).uifont

  text_alignment_name = options.fetch(:text_alignment, :left)
  text_alignment = text_alignment_name.nstextalignment

  default_break_mode = options[:size_to_fit] ? :word_wrap : :tail_truncation
  line_break_mode_name = options.fetch(:line_break_mode, default_break_mode)
  line_break_mode = line_break_mode_name.uilinebreakmode

  top_left_corner = CGPointMake(frame_inner_left, frame_inner_top)
  if options[:number_of_lines].to_i.zero?
    inner_rect = CGRectMake(*top_left_corner.to_a, frame_width, frame_height)
  end
  super.merge({
    text: text,
    is_html: options[:html].present?,
    text_color: text_color,
    font: font,
    text_alignment_name: text_alignment_name,
    text_alignment: text_alignment,
    line_break_mode_name: line_break_mode_name,
    line_break_mode: line_break_mode,
    line_spacing: options[:line_spacing],
    line_height: options[:line_height],
    underline: options[:underline],
    top_left_corner: top_left_corner,
    inner_rect: inner_rect
  })
end

#set_text_positionObject



106
107
108
109
110
111
112
113
114
# File 'motion-prime/elements/draw/label.rb', line 106

def set_text_position
  if computed_options.slice(:padding_top, :padding_bottom, :padding).values.none?
    computed_options[:width] ||= frame_width
    content_height = cached_content_height
    content_height = frame_outer_height if content_height > frame_outer_height
    @padding_top = (frame_outer_height - content_height)/2
    # @padding_top += 1 unless @padding_top.zero?
  end
end

#size_to_fit_if_neededObject



92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'motion-prime/elements/draw/label.rb', line 92

def size_to_fit_if_needed
  if computed_options[:size_to_fit]
    computed_options[:width] ||= cached_content_outer_width
    computed_options[:height] ||= cached_content_outer_height
    reset_computed_values
  elsif computed_options.slice(:width, :left, :right).values.none?
    computed_options[:width] ||= cached_content_outer_width
    reset_computed_values
  elsif computed_options.slice(:height, :top, :bottom).values.none?
    computed_options[:height] ||= cached_content_outer_height
    reset_computed_values
  end
end