ios - React-Native: Cannot trigger Native UIButton touch event -
i bridging native swift module react native. created uiview
creates uibutton
target handler on it. renders correctly, clicking button not trigger anything. have hosted demo here: https://github.com/esbenp/react-native-swift-test
my native module simple: https://github.com/esbenp/react-native-swift-test/blob/master/ios/testmodule.swift
let button = uibutton(frame: cgrect(x: 0, y: 0, width: 200, height: 50)) button.settitlecolor(uicolor.blue, for: .normal) button.settitle("press me", for: .normal) button.addtarget(self, action: #selector(testmodule.onclick), for: .touchupinside) self.addsubview(button)
i bridge using manager: https://github.com/esbenp/react-native-swift-test/blob/master/ios/testmodulemanager.m
#import <react/rctviewmanager.h> #import "reactnativeswifttest-swift.h" @interface testmodulemanager : rctviewmanager @end @implementation testmodulemanager rct_export_module() - (uiview *)view { return [[parent alloc] init]; } @end
and run in js: https://github.com/esbenp/react-native-swift-test/blob/master/index.ios.js
i no ios expert, seems related frame. if take same native module , use in normal ios project uiviewcontroller
so:
override func viewdidappear(_ animated: bool) { super.viewdidappear(animated) let button = testmodule(frame: cgrect(x: 0, y: 0, width: 500, height: 500)) self.view.addsubview(button) }
it works. assuming because frame react native creates width=0
, height=0
(it says @ least if nslog(string(describing: frame.size.height))
).
the ios mapview example specifies not override frame react native set this. not know if frame wrong or missing other context here? tried following instructions #2948 #15097 nothing helps.
i found error here. turns out have add flex: 1
actual native component on js side make frame fill out properly.
before
export default class reactnativeswifttest extends component { render() { return ( <view style={styles.container}> <test /> </view> ); } }
after
export default class reactnativeswifttest extends component { render() { return ( <view style={styles.container}> <test style={{flex: 1}} /> </view> ); } }
Comments
Post a Comment