jamonholmgren / ProMotion

ProMotion is a RubyMotion gem that makes iPhone development less like Objective-C and more like Ruby.
MIT License
1.26k stars 148 forks source link

Unable to position a TableView by using frame style #784

Closed augustosamame closed 8 years ago

augustosamame commented 8 years ago

Hi. I am unable to find a way to change a TableScreen layout, specifically the TableView cell's vertical starting position.

I have an UIView on the top of my screen to show some buttons, and the TableView cells should start underneath, but right now they are on top of each other.

I have even managed to move the TableView using the REPL console:

rmq(4496872960).nudge d: 10

where 4496872960 is the id of my UITableViewWrapperView object, but I have no idea where to put the layout coordinates for this object in code.

My screen code:

class HomeScreen < PM::TableScreen
  title I18n.t("home_screen.title")
  tab_bar_item title: I18n.t("home_screen.title"), item: "icon-home_32x32.png"
  row_height :auto, estimated: 30
  stylesheet HomeScreenStylesheet

  def on_load
    @matches = [{attributes: {status: "dummy1", player2: {email: "dummy1@match.com"}}},{attributes: {status: "dummy2", player2: {email: "dummy2@match.com"}}}]
    append(TopHomeView, :top_home_view)
    set_nav_bar_button :left, title: I18n.t("home_screen.sign_out_label"), image: image.resource("icon-logout-32x32.png"), action: :sign_out
    set_nav_bar_button :right, title: (Auth.current_user ? Auth.current_user["email"] : ""), image: image.resource("icon_user_50x50.png"), action: :open_profile

    load_async
  end

  def table_data
    [{
      cells: @matches.map do |match|
        {
          title: match[:attributes][:player2][:email],
          subtitle: match[:attributes][:status],
          action: :play_round,
          arguments: { match: match }
        }
      end
    }]
  end

EDIT:

I have kept trying to solve this and I have now added a style to my UITableViewWrapperView object like this:

def viewDidLoad
  super
  rmq(UITableViewWrapperView).apply_style(:style_for_table_wrapper)
end

In my stylesheet I am able to therefore style everything: background_color, hidden status, but the frame style is just ignored.

def top_home_view(st)
  st.frame = {l:20, t: 20, w: 300, h: 60}
  st.background_color = color.white
end
andrewhavens commented 8 years ago

Hi @augustosamame,

Table screens also have header and footer views. This sounds like a case where a header view would be appropriate. You can specify the view you want as your header view by defining a table_header_view and returning an instance of a UIView:

class HomeScreen < PM::TableScreen
  # ...
  def table_header_view
    create!(TopHomeView, :top_home_view)
  end

Note that the "bang method" (create!) will return an instance of UIView.

Let us know if you have any problems with this approach.

augustosamame commented 8 years ago

Yep. This worked. Thanks for your help!

augustosamame commented 8 years ago

This issue is solved but generated a slight complication. I am including a button in the table_header which will open another ProMotion Screen:

class MyTableHeader < UIView

  def on_load
    append(UIButton, :new_match_button).on(:tap) do |sender|
      open NewMatchScreen.new(nav_bar: true)
    end
  end

end

However, I am getting an error when trying to open the screen. I assume this is because the UIView class does not include the ProMotion open method. What is the correct way to include PM methods in the plain UIView class?

augustosamame commented 8 years ago

Never mind. Just found it. This code works:

class MyTableHeader < UIView

  def on_load
    append(UIButton, :new_match_button).on(:tap) do |sender|
      find.screen.open NewMatchScreen.new(nav_bar: true)
    end
  end

end