question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Picker on iOS doesn't ellipsize its text when an overflow happens

See original GitHub issue

Here is something I’m struggling to find a solution. I have a picker inside a form in my app, but when the text inside it is too big it won’t ellipsize on iOS. For example, this view on android:

screenshot_20181111-150016

Is displayed like this on iOS:

whatsapp image 2018-11-08 at 20 06 22

That is the issue in question! Bellow I’ll describe something that I have done to try to workaround the problem and is presenting even another issue

====

After playing a lot with flex and widths I decided to try to override the renderButton prop and force the ellipsize by hand by setting a width in it. Here is my component as it is right now:

export default class PickerInput extends React.Component {
  state = {
    itemWidth: styles.deviceWidth * 0.85,
    labelWidth: 0,
  };

  render() {
    const { label, children, selectedValue, ...other } = this.props;
    const style = {
      flex: 1,
    };
    if (!selectedValue && styles.OS === "android") {
      style.color = "rgba(51, 51, 51, .20)";
    }
    return (
      <Item
        picker
        style={{
          marginTop: 0,
        }}
        onLayout={e => this.setState({ itemWidth: e.nativeEvent.layout.width })}
      >
        {styles.OS === "android" || this.state.labelWidth ? (
          <Label>{label}</Label>
        ) : (
          <View
            onLayout={e =>
              this.setState({ labelWidth: e.nativeEvent.layout.width })
            }
          >
            <Label>{label}</Label>
          </View>
        )}
        <Picker
          mode="dialog"
          placeholderStyle={{ color: "#bfc6ea" }}
          iosHeader={this.props.label}
          iosIcon={
            <Icon name="ios-arrow-down" style={styles.styles.colorGray} />
          }
          renderButton={buttonProps => {
            // This only affects iOS. Copied from native-base's Picker.ios.js
            const { onPress, text, picker, selectedItem } = buttonProps;
            const textStyle = [picker.props.textStyle];
            if (!selectedItem) {
              textStyle.push(picker.props.placeholderStyle);
            }
            let width = this.state.itemWidth - this.state.labelWidth;
            // Give some border
            width -= styles.theme.isIphoneX ? 55 : 25;

            return (
              <Button
                dark
                picker
                transparent
                onPress={onPress}
                style={{
                  justifyContent: "flex-start",
                  width: Math.max(5, width),
                }}
              >
                <Text
                  numberOfLines={1}
                  ellipsizeMode="tail"
                  style={textStyle}
                  note={picker.props.note}
                >
                  {text}
                </Text>
                {picker.renderIcon()}
              </Button>
            );
          }}
          selectedValue={selectedValue}
          style={style}
          {...other}
        >
          {children}
        </Picker>
      </Item>
    );
  }
}

As you can see, I wait until the item and the label are rendered, get their width and set the width of them button as the difference between the 2. It works (not perfect, but works around the issue), but then I have this difference between an iPhone 6 and an iPhone X (tested on appetize.io):

iPhone 6: 2018-11-11 13-11-07 screenshot

iPhone X: 2018-11-11 13-14-07 screenshot

So, even though the solution is working nicely (again, as a work around) on iPhone 6, the same fix on iPhone X made the item itself overflows (even though I’m giving even more border for it).

So, like I said in the beginning, the main issue issue here is the lack of ellipsize in the picker provided by native-base. If it is solved, my issues with my workaround won’t matter. If you prefer that I describe something more or even open another issue for something not related here (e.g. the difference between iPhone X and iPhone 6) just ask!

Issue Analytics

  • State:closed
  • Created 5 years ago
  • Reactions:2
  • Comments:28 (7 by maintainers)

github_iconTop GitHub Comments

5reactions
bnash2501commented, May 10, 2019

@SupriyaKalghatgi Can we get this reopened? This is the PR that broke the pickers: https://github.com/GeekyAnts/NativeBase/commit/e1400842a2e0d766ccb8cfb23b13f9423c737a36 As pearpai has pointed out, the width should be the first style property so it can be overwritten. Not everyone uses full width pickers.

3reactions
bnash2501commented, Apr 29, 2019

I’m having a similar issue. If you are using inline labels for your pickers, the picker values will lay on top of the picker label. And there really isn’t a good way to fix this due to: <Text style={[this.props.textStyle, { width: Dimensions.get("window").width - 50 }]} note={this.props.note} numberOfLines={1} ellipsizeMode="tail"> There is now no control over the pickers width. We’ve had to downgrade to 2.12.0 due to this regression.

Read more comments on GitHub >

github_iconTop Results From Across the Web

How to make UILabel text appear with ellipsis at the end when ...
Go to attributes inspector. Select 'Line Breaks' and choose an option Truncate Tail. Check it by giving a text of more content size...
Read more >
text-overflow - CSS: Cascading Style Sheets - MDN Web Docs
The text-overflow CSS property sets how hidden overflow content is signaled to users. It can be clipped, display an ellipsis ('…
Read more >
Menus and actions - Components - Human Interface Guidelines
When people choose a menu item, the action occurs and the menu typically closes. Labels. Each menu item displays text to describe its...
Read more >
Android Autosizing TextViews, their pitfalls, and what to do ...
Before autosizing was an option, the best we could do whenever text wouldn't fit was to ellipsize it. It's fine if some text...
Read more >
hyphens | CSS-Tricks
The hyphens property controls hyphenation of text in block level elements. You can prevent hyphenation from happening at all, allow it, ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found