Fixed all the issues with iOS, and allow individual blurAmounts (instead of one shared value.)
Also changed VibrancyView to be a subclass of BlurView.
This commit is contained in:
parent
4e5ecf0109
commit
10858e396b
|
@ -168,8 +168,6 @@ const Menu = React.createClass({
|
||||||
- `blurAmount` (Default: 10, Number) - blur amount effect
|
- `blurAmount` (Default: 10, Number) - blur amount effect
|
||||||
- `0-100` - Adjusts blur intensity
|
- `0-100` - Adjusts blur intensity
|
||||||
|
|
||||||
*Note: `blurAmount` does not refresh with Hot Reloading. You must a refresh the app to view the results of the changes*
|
|
||||||
|
|
||||||
### Android
|
### Android
|
||||||
|
|
||||||
Android support uses an [external library](https://github.com/500px/500px-android-blur) which has slightly different properties and setup requirements. This is why extra code must be added manually to the `android/app/build.gradle` file as documented above.
|
Android support uses an [external library](https://github.com/500px/500px-android-blur) which has slightly different properties and setup requirements. This is why extra code must be added manually to the `android/app/build.gradle` file as documented above.
|
||||||
|
|
|
@ -16,9 +16,9 @@ import {
|
||||||
import { BlurView, VibrancyView } from 'react-native-blur'
|
import { BlurView, VibrancyView } from 'react-native-blur'
|
||||||
|
|
||||||
class Basic extends Component {
|
class Basic extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.state = {
|
this.state = {
|
||||||
showBlurs: true,
|
showBlurs: true,
|
||||||
blurBlurType: 'light',
|
blurBlurType: 'light',
|
||||||
|
@ -60,14 +60,15 @@ class Basic extends Component {
|
||||||
blurAmount={10}
|
blurAmount={10}
|
||||||
style={[styles.blurView]} />
|
style={[styles.blurView]} />
|
||||||
|
|
||||||
<Text style={styles.welcome}>{`Blur component`}</Text>
|
<Text style={styles.welcome}>Blur component</Text>
|
||||||
|
|
||||||
<SegmentedControlIOS
|
<SegmentedControlIOS
|
||||||
values={['xlight', 'light', 'dark']}
|
values={['xlight', 'light', 'dark']}
|
||||||
selectedIndex={this.state.blurActiveSegment}
|
selectedIndex={this.state.blurActiveSegment}
|
||||||
onChange={(event) => {this._onBlurChange(event)}}
|
onChange={(event) => {this._onBlurChange(event)}}
|
||||||
onValueChange={(value) => {this._onBlurValueChange(value)}}
|
onValueChange={(value) => {this._onBlurValueChange(value)}}
|
||||||
tintColor={this.state.blurBlurType == 'xlight' ? 'black' : 'white'}/>
|
tintColor={this.state.blurBlurType === 'xlight' ? 'black' : 'white'}
|
||||||
|
/>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/*
|
{/*
|
||||||
|
@ -76,15 +77,16 @@ class Basic extends Component {
|
||||||
*/}
|
*/}
|
||||||
<VibrancyView
|
<VibrancyView
|
||||||
blurType={this.state.vibrancyBlurType}
|
blurType={this.state.vibrancyBlurType}
|
||||||
blurAmount={1}
|
blurAmount={10}
|
||||||
style={[styles.container, styles.blurContainer]}>
|
style={[styles.container, styles.blurContainer]}>
|
||||||
<Text style={styles.welcome}>{`Vibrancy component`}</Text>
|
<Text style={styles.welcome}>Vibrancy component</Text>
|
||||||
<SegmentedControlIOS
|
<SegmentedControlIOS
|
||||||
values={['xlight', 'light', 'dark']}
|
values={['xlight', 'light', 'dark']}
|
||||||
selectedIndex={this.state.vibrancyActiveSegment}
|
selectedIndex={this.state.vibrancyActiveSegment}
|
||||||
onChange={(event) => {this._onVibrancyChange(event)}}
|
onChange={(event) => {this._onVibrancyChange(event)}}
|
||||||
onValueChange={(value) => {this._onVibrancyValueChange(value)}}
|
onValueChange={(value) => {this._onVibrancyValueChange(value)}}
|
||||||
tintColor={this.state.vibrancyBlurType == 'xlight' ? 'black' : 'white'}/>
|
tintColor="white"
|
||||||
|
/>
|
||||||
</VibrancyView>
|
</VibrancyView>
|
||||||
</View>
|
</View>
|
||||||
)
|
)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
};
|
};
|
||||||
objectVersion = 46;
|
objectVersion = 46;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
|
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
|
||||||
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
|
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
|
||||||
|
@ -102,6 +103,13 @@
|
||||||
remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
|
remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192;
|
||||||
remoteInfo = React;
|
remoteInfo = React;
|
||||||
};
|
};
|
||||||
|
209F89F11EA224BB004ABC64 /* PBXContainerItemProxy */ = {
|
||||||
|
isa = PBXContainerItemProxy;
|
||||||
|
containerPortal = 482A4E939D364AA89A71D498 /* RNBlur.xcodeproj */;
|
||||||
|
proxyType = 2;
|
||||||
|
remoteGlobalIDString = A68BD7BC1BC31318005F02DF;
|
||||||
|
remoteInfo = RNBlur;
|
||||||
|
};
|
||||||
2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
|
2D02E4911E0B4A5D006451C7 /* PBXContainerItemProxy */ = {
|
||||||
isa = PBXContainerItemProxy;
|
isa = PBXContainerItemProxy;
|
||||||
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
|
||||||
|
@ -252,11 +260,11 @@
|
||||||
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
|
||||||
2D02E47B1E0B4A5D006451C7 /* Basic-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Basic-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
2D02E47B1E0B4A5D006451C7 /* Basic-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Basic-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
2D02E4901E0B4A5D006451C7 /* Basic-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Basic-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
2D02E4901E0B4A5D006451C7 /* Basic-tvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Basic-tvOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
482A4E939D364AA89A71D498 /* RNBlur.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNBlur.xcodeproj; path = ../../../ios/RNBlur.xcodeproj; sourceTree = "<group>"; };
|
||||||
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
|
5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
|
||||||
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
|
||||||
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
|
||||||
482A4E939D364AA89A71D498 /* RNBlur.xcodeproj */ = {isa = PBXFileReference; name = "RNBlur.xcodeproj"; path = "../node_modules/react-native-blur/ios/RNBlur.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
|
A8E69D2A0C5C4828B32057AD /* libRNBlur.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNBlur.a; sourceTree = "<group>"; };
|
||||||
A8E69D2A0C5C4828B32057AD /* libRNBlur.a */ = {isa = PBXFileReference; name = "libRNBlur.a"; path = "libRNBlur.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
|
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -418,6 +426,14 @@
|
||||||
name = Products;
|
name = Products;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
209F89D51EA224BB004ABC64 /* Products */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
209F89F21EA224BB004ABC64 /* libRNBlur.a */,
|
||||||
|
);
|
||||||
|
name = Products;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5E91572E1DD0AC6500FF2AA8 /* Products */ = {
|
5E91572E1DD0AC6500FF2AA8 /* Products */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
@ -568,7 +584,7 @@
|
||||||
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
83CBB9F71A601CBA00E9B192 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
attributes = {
|
attributes = {
|
||||||
LastUpgradeCheck = 610;
|
LastUpgradeCheck = 0830;
|
||||||
ORGANIZATIONNAME = Facebook;
|
ORGANIZATIONNAME = Facebook;
|
||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
00E356ED1AD99517003FC87E = {
|
00E356ED1AD99517003FC87E = {
|
||||||
|
@ -642,6 +658,10 @@
|
||||||
ProductGroup = 146834001AC3E56700842450 /* Products */;
|
ProductGroup = 146834001AC3E56700842450 /* Products */;
|
||||||
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */;
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
ProductGroup = 209F89D51EA224BB004ABC64 /* Products */;
|
||||||
|
ProjectRef = 482A4E939D364AA89A71D498 /* RNBlur.xcodeproj */;
|
||||||
|
},
|
||||||
);
|
);
|
||||||
projectRoot = "";
|
projectRoot = "";
|
||||||
targets = (
|
targets = (
|
||||||
|
@ -710,6 +730,13 @@
|
||||||
remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
|
remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */;
|
||||||
sourceTree = BUILT_PRODUCTS_DIR;
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
};
|
};
|
||||||
|
209F89F21EA224BB004ABC64 /* libRNBlur.a */ = {
|
||||||
|
isa = PBXReferenceProxy;
|
||||||
|
fileType = archive.ar;
|
||||||
|
path = libRNBlur.a;
|
||||||
|
remoteRef = 209F89F11EA224BB004ABC64 /* PBXContainerItemProxy */;
|
||||||
|
sourceTree = BUILT_PRODUCTS_DIR;
|
||||||
|
};
|
||||||
3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
|
3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */ = {
|
||||||
isa = PBXReferenceProxy;
|
isa = PBXReferenceProxy;
|
||||||
fileType = archive.ar;
|
fileType = archive.ar;
|
||||||
|
@ -967,23 +994,24 @@
|
||||||
"DEBUG=1",
|
"DEBUG=1",
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
);
|
);
|
||||||
INFOPLIST_FILE = BasicTests/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
);
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
HEADER_SEARCH_PATHS = (
|
HEADER_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
);
|
);
|
||||||
|
INFOPLIST_FILE = BasicTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -992,23 +1020,24 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BUNDLE_LOADER = "$(TEST_HOST)";
|
BUNDLE_LOADER = "$(TEST_HOST)";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
INFOPLIST_FILE = BasicTests/Info.plist;
|
|
||||||
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
|
||||||
OTHER_LDFLAGS = (
|
|
||||||
"-ObjC",
|
|
||||||
"-lc++",
|
|
||||||
);
|
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic";
|
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
HEADER_SEARCH_PATHS = (
|
HEADER_SEARCH_PATHS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
);
|
);
|
||||||
|
INFOPLIST_FILE = BasicTests/Info.plist;
|
||||||
|
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
|
OTHER_LDFLAGS = (
|
||||||
|
"-ObjC",
|
||||||
|
"-lc++",
|
||||||
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic.app/Basic";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -1018,6 +1047,10 @@
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
DEAD_CODE_STRIPPING = NO;
|
DEAD_CODE_STRIPPING = NO;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
|
);
|
||||||
INFOPLIST_FILE = Basic/Info.plist;
|
INFOPLIST_FILE = Basic/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
|
@ -1025,12 +1058,9 @@
|
||||||
"-ObjC",
|
"-ObjC",
|
||||||
"-lc++",
|
"-lc++",
|
||||||
);
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = Basic;
|
PRODUCT_NAME = Basic;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -1039,6 +1069,10 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
CURRENT_PROJECT_VERSION = 1;
|
CURRENT_PROJECT_VERSION = 1;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
|
);
|
||||||
INFOPLIST_FILE = Basic/Info.plist;
|
INFOPLIST_FILE = Basic/Info.plist;
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
|
@ -1046,12 +1080,9 @@
|
||||||
"-ObjC",
|
"-ObjC",
|
||||||
"-lc++",
|
"-lc++",
|
||||||
);
|
);
|
||||||
|
PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
|
||||||
PRODUCT_NAME = Basic;
|
PRODUCT_NAME = Basic;
|
||||||
VERSIONING_SYSTEM = "apple-generic";
|
VERSIONING_SYSTEM = "apple-generic";
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -1067,8 +1098,16 @@
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
ENABLE_TESTABILITY = YES;
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
|
);
|
||||||
INFOPLIST_FILE = "Basic-tvOS/Info.plist";
|
INFOPLIST_FILE = "Basic-tvOS/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"-ObjC",
|
"-ObjC",
|
||||||
"-lc++",
|
"-lc++",
|
||||||
|
@ -1078,14 +1117,6 @@
|
||||||
SDKROOT = appletvos;
|
SDKROOT = appletvos;
|
||||||
TARGETED_DEVICE_FAMILY = 3;
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
TVOS_DEPLOYMENT_TARGET = 9.2;
|
TVOS_DEPLOYMENT_TARGET = 9.2;
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -1101,8 +1132,16 @@
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
|
HEADER_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
||||||
|
);
|
||||||
INFOPLIST_FILE = "Basic-tvOS/Info.plist";
|
INFOPLIST_FILE = "Basic-tvOS/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"-ObjC",
|
"-ObjC",
|
||||||
"-lc++",
|
"-lc++",
|
||||||
|
@ -1112,14 +1151,6 @@
|
||||||
SDKROOT = appletvos;
|
SDKROOT = appletvos;
|
||||||
TARGETED_DEVICE_FAMILY = 3;
|
TARGETED_DEVICE_FAMILY = 3;
|
||||||
TVOS_DEPLOYMENT_TARGET = 9.2;
|
TVOS_DEPLOYMENT_TARGET = 9.2;
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
HEADER_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"$(SRCROOT)/../node_modules/react-native-blur/ios",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -1136,15 +1167,15 @@
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
INFOPLIST_FILE = "Basic-tvOSTests/Info.plist";
|
INFOPLIST_FILE = "Basic-tvOSTests/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.Basic-tvOSTests";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.Basic-tvOSTests";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SDKROOT = appletvos;
|
SDKROOT = appletvos;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic-tvOS.app/Basic-tvOS";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic-tvOS.app/Basic-tvOS";
|
||||||
TVOS_DEPLOYMENT_TARGET = 10.1;
|
TVOS_DEPLOYMENT_TARGET = 10.1;
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
@ -1161,15 +1192,15 @@
|
||||||
GCC_NO_COMMON_BLOCKS = YES;
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
INFOPLIST_FILE = "Basic-tvOSTests/Info.plist";
|
INFOPLIST_FILE = "Basic-tvOSTests/Info.plist";
|
||||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
||||||
|
);
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.Basic-tvOSTests";
|
PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.REACT.Basic-tvOSTests";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SDKROOT = appletvos;
|
SDKROOT = appletvos;
|
||||||
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic-tvOS.app/Basic-tvOS";
|
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Basic-tvOS.app/Basic-tvOS";
|
||||||
TVOS_DEPLOYMENT_TARGET = 10.1;
|
TVOS_DEPLOYMENT_TARGET = 10.1;
|
||||||
LIBRARY_SEARCH_PATHS = (
|
|
||||||
"$(inherited)",
|
|
||||||
"\"$(SRCROOT)/$(TARGET_NAME)\"",
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
};
|
};
|
||||||
|
@ -1186,15 +1217,19 @@
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
|
ENABLE_TESTABILITY = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
GCC_DYNAMIC_NO_PIC = NO;
|
GCC_DYNAMIC_NO_PIC = NO;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
GCC_PREPROCESSOR_DEFINITIONS = (
|
GCC_PREPROCESSOR_DEFINITIONS = (
|
||||||
"DEBUG=1",
|
"DEBUG=1",
|
||||||
|
@ -1227,8 +1262,10 @@
|
||||||
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
CLANG_WARN_ENUM_CONVERSION = YES;
|
CLANG_WARN_ENUM_CONVERSION = YES;
|
||||||
|
CLANG_WARN_INFINITE_RECURSION = YES;
|
||||||
CLANG_WARN_INT_CONVERSION = YES;
|
CLANG_WARN_INT_CONVERSION = YES;
|
||||||
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
|
||||||
|
CLANG_WARN_SUSPICIOUS_MOVE = YES;
|
||||||
CLANG_WARN_UNREACHABLE_CODE = YES;
|
CLANG_WARN_UNREACHABLE_CODE = YES;
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
|
||||||
|
@ -1236,6 +1273,7 @@
|
||||||
ENABLE_NS_ASSERTIONS = NO;
|
ENABLE_NS_ASSERTIONS = NO;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
GCC_C_LANGUAGE_STANDARD = gnu99;
|
GCC_C_LANGUAGE_STANDARD = gnu99;
|
||||||
|
GCC_NO_COMMON_BLOCKS = YES;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
|
||||||
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
GCC_WARN_UNDECLARED_SELECTOR = YES;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0820"
|
LastUpgradeVersion = "0830"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "NO"
|
parallelizeBuildables = "NO"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Scheme
|
<Scheme
|
||||||
LastUpgradeVersion = "0620"
|
LastUpgradeVersion = "0830"
|
||||||
version = "1.3">
|
version = "1.3">
|
||||||
<BuildAction
|
<BuildAction
|
||||||
parallelizeBuildables = "NO"
|
parallelizeBuildables = "NO"
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
@ -24,6 +24,19 @@
|
||||||
<string>1</string>
|
<string>1</string>
|
||||||
<key>LSRequiresIPhoneOS</key>
|
<key>LSRequiresIPhoneOS</key>
|
||||||
<true/>
|
<true/>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionDomains</key>
|
||||||
|
<dict>
|
||||||
|
<key>localhost</key>
|
||||||
|
<dict>
|
||||||
|
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>NSLocationWhenInUseUsageDescription</key>
|
||||||
|
<string></string>
|
||||||
<key>UILaunchStoryboardName</key>
|
<key>UILaunchStoryboardName</key>
|
||||||
<string>LaunchScreen</string>
|
<string>LaunchScreen</string>
|
||||||
<key>UIRequiredDeviceCapabilities</key>
|
<key>UIRequiredDeviceCapabilities</key>
|
||||||
|
@ -38,19 +51,5 @@
|
||||||
</array>
|
</array>
|
||||||
<key>UIViewControllerBasedStatusBarAppearance</key>
|
<key>UIViewControllerBasedStatusBarAppearance</key>
|
||||||
<false/>
|
<false/>
|
||||||
<key>NSLocationWhenInUseUsageDescription</key>
|
|
||||||
<string></string>
|
|
||||||
<key>NSAppTransportSecurity</key>
|
|
||||||
<!--See http://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/ -->
|
|
||||||
<dict>
|
|
||||||
<key>NSExceptionDomains</key>
|
|
||||||
<dict>
|
|
||||||
<key>localhost</key>
|
|
||||||
<dict>
|
|
||||||
<key>NSExceptionAllowsInsecureHTTPLoads</key>
|
|
||||||
<true/>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
<key>CFBundleExecutable</key>
|
<key>CFBundleExecutable</key>
|
||||||
<string>$(EXECUTABLE_NAME)</string>
|
<string>$(EXECUTABLE_NAME)</string>
|
||||||
<key>CFBundleIdentifier</key>
|
<key>CFBundleIdentifier</key>
|
||||||
<string>org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)</string>
|
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||||
<key>CFBundleInfoDictionaryVersion</key>
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
<string>6.0</string>
|
<string>6.0</string>
|
||||||
<key>CFBundleName</key>
|
<key>CFBundleName</key>
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
|
|
||||||
@interface BlurAmount : UIBlurEffect
|
|
||||||
|
|
||||||
@property (nonatomic, copy) NSNumber *blurAmount;
|
|
||||||
|
|
||||||
+ (id)updateBlurAmount:(NSNumber*)blurAmount;
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,54 +0,0 @@
|
||||||
#import "BlurAmount.h"
|
|
||||||
#import <objc/runtime.h>
|
|
||||||
|
|
||||||
@interface UIBlurEffect (Protected)
|
|
||||||
|
|
||||||
@property (nonatomic, readonly) id effectSettings;
|
|
||||||
@property (nonatomic, copy, class) NSNumber *localBlurAmount;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
@implementation BlurAmount
|
|
||||||
|
|
||||||
static NSNumber *_localBlurAmount = nil;
|
|
||||||
|
|
||||||
+ (instancetype)effectWithStyle:(UIBlurEffectStyle)style
|
|
||||||
{
|
|
||||||
id result = [super effectWithStyle:style];
|
|
||||||
object_setClass(result, self);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id)effectSettings
|
|
||||||
{
|
|
||||||
id settings = [super effectSettings];
|
|
||||||
[settings setValue:BlurAmount.localBlurAmount forKey:@"blurRadius"];
|
|
||||||
return settings;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (id)copyWithZone:(NSZone*)zone
|
|
||||||
{
|
|
||||||
id result = [super copyWithZone:zone];
|
|
||||||
object_setClass(result, [self class]);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (void)setLocalBlurAmount:(NSNumber *)localBlurAmount {
|
|
||||||
if (localBlurAmount != _localBlurAmount) {
|
|
||||||
_localBlurAmount = localBlurAmount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (NSNumber *)localBlurAmount {
|
|
||||||
return _localBlurAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ (id)updateBlurAmount:(NSNumber*)blurAmount
|
|
||||||
{
|
|
||||||
self.localBlurAmount = blurAmount;
|
|
||||||
return blurAmount;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#import <UIKit/UIKit.h>
|
||||||
|
|
||||||
|
@interface BlurEffectWithAmount : UIBlurEffect
|
||||||
|
@property (nonatomic, strong) NSNumber *blurAmount;
|
||||||
|
|
||||||
|
+ (instancetype)effectWithStyle:(UIBlurEffectStyle)style andBlurAmount:(NSNumber*)blurAmount;
|
||||||
|
@end
|
|
@ -0,0 +1,65 @@
|
||||||
|
//
|
||||||
|
// We subclass UIBlurEffect so that we can set the BlurAmount.
|
||||||
|
// See: http://stackoverflow.com/a/30744777/304706
|
||||||
|
//
|
||||||
|
|
||||||
|
#import "BlurEffectWithAmount.h"
|
||||||
|
#import <objc/runtime.h>
|
||||||
|
|
||||||
|
@interface UIBlurEffect (Protected)
|
||||||
|
|
||||||
|
@property (nonatomic, readonly) id effectSettings;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation BlurEffectWithAmount
|
||||||
|
@dynamic blurAmount;
|
||||||
|
|
||||||
|
+ (instancetype)effectWithStyle:(UIBlurEffectStyle)style
|
||||||
|
{
|
||||||
|
id instance = [super effectWithStyle:style];
|
||||||
|
object_setClass(instance, self);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (instancetype)effectWithStyle:(UIBlurEffectStyle)style andBlurAmount:(NSNumber*)blurAmount
|
||||||
|
{
|
||||||
|
BlurEffectWithAmount *effect = (BlurEffectWithAmount*)[self effectWithStyle:style];
|
||||||
|
effect.blurAmount = blurAmount;
|
||||||
|
return effect;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setBlurAmount:(NSNumber*)blurAmount {
|
||||||
|
objc_setAssociatedObject(self,
|
||||||
|
@selector(blurAmount),
|
||||||
|
blurAmount,
|
||||||
|
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSNumber*)blurAmount {
|
||||||
|
return objc_getAssociatedObject(self, @selector(blurAmount));
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)effectSettings
|
||||||
|
{
|
||||||
|
id settings = [super effectSettings];
|
||||||
|
NSNumber *blurAmount = self.blurAmount;
|
||||||
|
if (blurAmount) {
|
||||||
|
[settings setValue:blurAmount forKey:@"blurRadius"];
|
||||||
|
}
|
||||||
|
return settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (id)copyWithZone:(NSZone*)zone
|
||||||
|
{
|
||||||
|
id instance = [super copyWithZone:zone];
|
||||||
|
object_setClass(instance, [self class]);
|
||||||
|
// Must also copy blur amount to new instance
|
||||||
|
objc_setAssociatedObject(instance,
|
||||||
|
@selector(blurAmount),
|
||||||
|
self.blurAmount,
|
||||||
|
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
|
@ -1,8 +1,13 @@
|
||||||
#import <UIKit/UIKit.h>
|
#import <UIKit/UIKit.h>
|
||||||
|
#import "BlurEffectWithAmount.h"
|
||||||
|
|
||||||
@interface BlurView : UIView
|
@interface BlurView : UIView
|
||||||
|
|
||||||
@property (nonatomic, copy) NSString *blurType;
|
@property (nonatomic, copy) NSString *blurType;
|
||||||
@property (nonatomic, copy) NSNumber *blurAmount;
|
@property (nonatomic, copy) NSNumber *blurAmount;
|
||||||
|
|
||||||
|
@property (nonatomic, strong) BlurEffectWithAmount *blurEffect;
|
||||||
|
@property (nonatomic, strong) UIVisualEffectView *blurEffectView;
|
||||||
|
|
||||||
|
- (void)updateBlurEffect;
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -1,48 +1,66 @@
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import "BlurView.h"
|
#import "BlurView.h"
|
||||||
#import "BlurAmount.h"
|
#import "BlurEffectWithAmount.h"
|
||||||
|
|
||||||
@interface BlurView ()
|
@interface BlurView ()
|
||||||
|
|
||||||
@property (nonatomic, strong) UIVisualEffectView *visualEffectView;
|
|
||||||
@property (nonatomic, strong) UIBlurEffect *blurEffect;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation BlurView
|
@implementation BlurView
|
||||||
|
|
||||||
- (instancetype)initWithFrame:(CGRect)frame {
|
- (instancetype)initWithFrame:(CGRect)frame {
|
||||||
if (self = [super initWithFrame:frame]) {
|
if (self = [super initWithFrame:frame]) {
|
||||||
self.blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
self.blurEffectView = [[UIVisualEffectView alloc] init];
|
||||||
self.visualEffectView = [[UIVisualEffectView alloc] initWithEffect:self.blurEffect];
|
self.blurEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
||||||
self.visualEffectView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
|
self.blurEffectView.frame = frame;
|
||||||
self.visualEffectView.frame = frame;
|
|
||||||
|
self.blurAmount = @10;
|
||||||
|
self.blurType = @"dark";
|
||||||
|
[self updateBlurEffect];
|
||||||
|
|
||||||
self.clipsToBounds = true;
|
self.clipsToBounds = true;
|
||||||
|
|
||||||
[self addSubview:self.visualEffectView];
|
[self addSubview:self.blurEffectView];
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)layoutSubviews
|
||||||
|
{
|
||||||
|
[super layoutSubviews];
|
||||||
|
self.blurEffectView.frame = self.bounds;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)setBlurType:(NSString *)blurType
|
- (void)setBlurType:(NSString *)blurType
|
||||||
{
|
{
|
||||||
if ([blurType isEqual: @"xlight"]) {
|
if (blurType && ![self.blurType isEqual:blurType]) {
|
||||||
self.blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
|
_blurType = blurType;
|
||||||
} else if ([blurType isEqual: @"light"]) {
|
[self updateBlurEffect];
|
||||||
self.blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
|
}
|
||||||
} else if ([blurType isEqual: @"dark"]) {
|
|
||||||
self.blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
|
||||||
} else {
|
|
||||||
self.blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
|
||||||
}
|
|
||||||
self.visualEffectView.effect = self.blurEffect;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setBlurAmount:(NSNumber *)blurAmount
|
- (void)setBlurAmount:(NSNumber *)blurAmount
|
||||||
{
|
{
|
||||||
[BlurAmount updateBlurAmount:blurAmount];
|
if (blurAmount && ![self.blurAmount isEqualToNumber:blurAmount]) {
|
||||||
|
_blurAmount = blurAmount;
|
||||||
|
[self updateBlurEffect];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
- (UIBlurEffectStyle)blurEffectStyle
|
||||||
|
{
|
||||||
|
if ([self.blurType isEqual: @"xlight"]) return UIBlurEffectStyleExtraLight;
|
||||||
|
if ([self.blurType isEqual: @"light"]) return UIBlurEffectStyleLight;
|
||||||
|
if ([self.blurType isEqual: @"dark"]) return UIBlurEffectStyleDark;
|
||||||
|
return UIBlurEffectStyleDark;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateBlurEffect
|
||||||
|
{
|
||||||
|
UIBlurEffectStyle style = [self blurEffectStyle];
|
||||||
|
self.blurEffect = [BlurEffectWithAmount effectWithStyle:style andBlurAmount:self.blurAmount];
|
||||||
|
self.blurEffectView.effect = self.blurEffect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -7,9 +7,9 @@
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
256D23D71E1EBA540023CA16 /* BlurEffectWithAmount.m in Sources */ = {isa = PBXBuildFile; fileRef = 256D23D61E1EBA540023CA16 /* BlurEffectWithAmount.m */; };
|
||||||
A68BD7CC1BC31332005F02DF /* VibrancyView.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7C91BC31332005F02DF /* VibrancyView.m */; };
|
A68BD7CC1BC31332005F02DF /* VibrancyView.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7C91BC31332005F02DF /* VibrancyView.m */; };
|
||||||
A68BD7CD1BC31332005F02DF /* VibrancyViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7CB1BC31332005F02DF /* VibrancyViewManager.m */; };
|
A68BD7CD1BC31332005F02DF /* VibrancyViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7CB1BC31332005F02DF /* VibrancyViewManager.m */; };
|
||||||
256D23D71E1EBA540023CA16 /* BlurAmount.m in Sources */ = {isa = PBXBuildFile; fileRef = 256D23D61E1EBA540023CA16 /* BlurAmount.m */; };
|
|
||||||
A68BD7D21BC31341005F02DF /* BlurView.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7CF1BC31341005F02DF /* BlurView.m */; };
|
A68BD7D21BC31341005F02DF /* BlurView.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7CF1BC31341005F02DF /* BlurView.m */; };
|
||||||
A68BD7D31BC31341005F02DF /* BlurViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7D11BC31341005F02DF /* BlurViewManager.m */; };
|
A68BD7D31BC31341005F02DF /* BlurViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = A68BD7D11BC31341005F02DF /* BlurViewManager.m */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
@ -27,13 +27,13 @@
|
||||||
/* End PBXCopyFilesBuildPhase section */
|
/* End PBXCopyFilesBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
256D23D51E1EBA540023CA16 /* BlurEffectWithAmount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurEffectWithAmount.h; sourceTree = "<group>"; };
|
||||||
|
256D23D61E1EBA540023CA16 /* BlurEffectWithAmount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlurEffectWithAmount.m; sourceTree = "<group>"; };
|
||||||
A68BD7BC1BC31318005F02DF /* libRNBlur.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNBlur.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
A68BD7BC1BC31318005F02DF /* libRNBlur.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNBlur.a; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
A68BD7C81BC31332005F02DF /* VibrancyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrancyView.h; sourceTree = SOURCE_ROOT; };
|
A68BD7C81BC31332005F02DF /* VibrancyView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrancyView.h; sourceTree = SOURCE_ROOT; };
|
||||||
A68BD7C91BC31332005F02DF /* VibrancyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VibrancyView.m; sourceTree = SOURCE_ROOT; };
|
A68BD7C91BC31332005F02DF /* VibrancyView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VibrancyView.m; sourceTree = SOURCE_ROOT; };
|
||||||
A68BD7CA1BC31332005F02DF /* VibrancyViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrancyViewManager.h; sourceTree = SOURCE_ROOT; };
|
A68BD7CA1BC31332005F02DF /* VibrancyViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VibrancyViewManager.h; sourceTree = SOURCE_ROOT; };
|
||||||
A68BD7CB1BC31332005F02DF /* VibrancyViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VibrancyViewManager.m; sourceTree = SOURCE_ROOT; };
|
A68BD7CB1BC31332005F02DF /* VibrancyViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VibrancyViewManager.m; sourceTree = SOURCE_ROOT; };
|
||||||
256D23D51E1EBA540023CA16 /* BlurAmount.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurAmount.h; sourceTree = "<group>"; };
|
|
||||||
256D23D61E1EBA540023CA16 /* BlurAmount.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlurAmount.m; sourceTree = "<group>"; };
|
|
||||||
A68BD7CE1BC31341005F02DF /* BlurView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurView.h; sourceTree = SOURCE_ROOT; };
|
A68BD7CE1BC31341005F02DF /* BlurView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurView.h; sourceTree = SOURCE_ROOT; };
|
||||||
A68BD7CF1BC31341005F02DF /* BlurView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlurView.m; sourceTree = SOURCE_ROOT; };
|
A68BD7CF1BC31341005F02DF /* BlurView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BlurView.m; sourceTree = SOURCE_ROOT; };
|
||||||
A68BD7D01BC31341005F02DF /* BlurViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurViewManager.h; sourceTree = SOURCE_ROOT; };
|
A68BD7D01BC31341005F02DF /* BlurViewManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlurViewManager.h; sourceTree = SOURCE_ROOT; };
|
||||||
|
@ -54,8 +54,8 @@
|
||||||
A68BD7B31BC31318005F02DF = {
|
A68BD7B31BC31318005F02DF = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
256D23D51E1EBA540023CA16 /* BlurAmount.h */,
|
256D23D51E1EBA540023CA16 /* BlurEffectWithAmount.h */,
|
||||||
256D23D61E1EBA540023CA16 /* BlurAmount.m */,
|
256D23D61E1EBA540023CA16 /* BlurEffectWithAmount.m */,
|
||||||
A68BD7CE1BC31341005F02DF /* BlurView.h */,
|
A68BD7CE1BC31341005F02DF /* BlurView.h */,
|
||||||
A68BD7CF1BC31341005F02DF /* BlurView.m */,
|
A68BD7CF1BC31341005F02DF /* BlurView.m */,
|
||||||
A68BD7D01BC31341005F02DF /* BlurViewManager.h */,
|
A68BD7D01BC31341005F02DF /* BlurViewManager.h */,
|
||||||
|
@ -134,7 +134,7 @@
|
||||||
files = (
|
files = (
|
||||||
A68BD7CC1BC31332005F02DF /* VibrancyView.m in Sources */,
|
A68BD7CC1BC31332005F02DF /* VibrancyView.m in Sources */,
|
||||||
A68BD7CD1BC31332005F02DF /* VibrancyViewManager.m in Sources */,
|
A68BD7CD1BC31332005F02DF /* VibrancyViewManager.m in Sources */,
|
||||||
256D23D71E1EBA540023CA16 /* BlurAmount.m in Sources */,
|
256D23D71E1EBA540023CA16 /* BlurEffectWithAmount.m in Sources */,
|
||||||
A68BD7D21BC31341005F02DF /* BlurView.m in Sources */,
|
A68BD7D21BC31341005F02DF /* BlurView.m in Sources */,
|
||||||
A68BD7D31BC31341005F02DF /* BlurViewManager.m in Sources */,
|
A68BD7D31BC31341005F02DF /* BlurViewManager.m in Sources */,
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,4 @@
|
||||||
#import <UIKit/UIKit.h>
|
#import "BlurView.h"
|
||||||
|
|
||||||
@interface VibrancyView : UIView
|
@interface VibrancyView : BlurView
|
||||||
|
@end
|
||||||
@property (nonatomic, copy) NSString *blurType;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import "VibrancyView.h"
|
|
||||||
#import "BlurView.h"
|
|
||||||
#import <React/RCTComponent.h>
|
#import <React/RCTComponent.h>
|
||||||
|
#import "BlurView.h"
|
||||||
|
#import "VibrancyView.h"
|
||||||
|
|
||||||
@interface VibrancyView ()
|
@interface VibrancyView ()
|
||||||
|
|
||||||
@property (nonatomic, strong) UIVisualEffectView *visualEffectView;
|
@property (nonatomic, strong) UIVibrancyEffect *vibrancyEffect;
|
||||||
@property (nonatomic, strong) UIVisualEffectView *vibrancyView;
|
@property (nonatomic, strong) UIVisualEffectView *vibrancyEffectView;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
@ -14,48 +13,36 @@
|
||||||
|
|
||||||
- (instancetype)initWithFrame:(CGRect)frame {
|
- (instancetype)initWithFrame:(CGRect)frame {
|
||||||
if (self = [super initWithFrame:frame]) {
|
if (self = [super initWithFrame:frame]) {
|
||||||
UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
self.vibrancyEffectView = [[UIVisualEffectView alloc] init];
|
||||||
self.visualEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
|
self.vibrancyEffectView.frame = frame;
|
||||||
|
[self updateVibrancyEffect];
|
||||||
|
|
||||||
UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
|
[self.blurEffectView.contentView addSubview:self.vibrancyEffectView];
|
||||||
self.vibrancyView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
|
|
||||||
|
|
||||||
self.visualEffectView.frame = frame;
|
|
||||||
self.vibrancyView.frame = frame;
|
|
||||||
|
|
||||||
[self addSubview:self.visualEffectView];
|
|
||||||
[self.visualEffectView.contentView addSubview:self.vibrancyView];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(void)layoutSubviews
|
- (void)layoutSubviews
|
||||||
{
|
{
|
||||||
[super layoutSubviews];
|
[super layoutSubviews];
|
||||||
|
self.vibrancyEffectView.frame = self.bounds;
|
||||||
self.visualEffectView.frame = self.bounds;
|
|
||||||
self.vibrancyView.frame = self.bounds;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setBlurType:(NSString *)blurType {
|
|
||||||
UIBlurEffect *blurEffect;
|
|
||||||
|
|
||||||
self.clipsToBounds = true;
|
|
||||||
if ([blurType isEqual: @"xlight"]) {
|
|
||||||
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
|
|
||||||
} else if ([blurType isEqual: @"light"]) {
|
|
||||||
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
|
|
||||||
} else if ([blurType isEqual: @"dark"]) {
|
|
||||||
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
|
||||||
} else {
|
|
||||||
blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleDark];
|
|
||||||
}
|
|
||||||
self.visualEffectView.effect = blurEffect;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)insertReactSubview:(id<RCTComponent>)subview atIndex:(NSInteger)atIndex {
|
- (void)insertReactSubview:(id<RCTComponent>)subview atIndex:(NSInteger)atIndex {
|
||||||
[self.vibrancyView.contentView addSubview:(UIView*)subview];
|
[self.vibrancyEffectView.contentView addSubview:(UIView*)subview];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateBlurEffect
|
||||||
|
{
|
||||||
|
[super updateBlurEffect];
|
||||||
|
[self updateVibrancyEffect];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateVibrancyEffect
|
||||||
|
{
|
||||||
|
self.vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:self.blurEffect];
|
||||||
|
self.vibrancyEffectView.effect = self.vibrancyEffect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#import <Foundation/Foundation.h>
|
|
||||||
#import <UIKit/UIKit.h>
|
|
||||||
#import "VibrancyViewManager.h"
|
#import "VibrancyViewManager.h"
|
||||||
#import "VibrancyView.h"
|
#import "VibrancyView.h"
|
||||||
|
|
||||||
|
@ -13,5 +11,6 @@ RCT_EXPORT_MODULE();
|
||||||
}
|
}
|
||||||
|
|
||||||
RCT_EXPORT_VIEW_PROPERTY(blurType, NSString);
|
RCT_EXPORT_VIEW_PROPERTY(blurType, NSString);
|
||||||
|
RCT_EXPORT_VIEW_PROPERTY(blurAmount, NSNumber);
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -8,7 +8,7 @@ class VibrancyView extends Component {
|
||||||
{...this.props}
|
{...this.props}
|
||||||
style={[{
|
style={[{
|
||||||
backgroundColor: 'transparent',
|
backgroundColor: 'transparent',
|
||||||
}, this.props.style
|
}, this.props.style,
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
@ -17,6 +17,11 @@ class VibrancyView extends Component {
|
||||||
|
|
||||||
VibrancyView.propTypes = {
|
VibrancyView.propTypes = {
|
||||||
blurType: PropTypes.string,
|
blurType: PropTypes.string,
|
||||||
|
blurAmount: PropTypes.number.isRequired,
|
||||||
|
};
|
||||||
|
|
||||||
|
VibrancyView.defaultProps = {
|
||||||
|
blurAmount: 10,
|
||||||
};
|
};
|
||||||
|
|
||||||
const NativeVibrancyView = requireNativeComponent('VibrancyView', VibrancyView);
|
const NativeVibrancyView = requireNativeComponent('VibrancyView', VibrancyView);
|
||||||
|
|
Loading…
Reference in New Issue