Skip to content

Commit f55bd3b

Browse files
Fix hitbox of UIBarButtonItem (wix#6482)
Fixes wix#5000 Before: <img width="280" alt="Screenshot 2020-08-19 at 18 54 21" src="https://user-images.githubusercontent.com/996231/90669241-99df5480-e251-11ea-913a-674b0d6b0797.png"> After: <img width="291" alt="Screenshot 2020-08-19 at 18 53 11" src="https://user-images.githubusercontent.com/996231/90669274-a8c60700-e251-11ea-9816-20b17f9657e5.png"> As can be seen the hitbox increases maintaining the custom inset of 15 left. This was changed to a button in wix@545e5fe while adding support for insets. Since they are set on the image it works either way. Maybe @yogevbd has some more insight. Co-authored-by: yogevbd <[email protected]>
1 parent 91fd35f commit f55bd3b

5 files changed

+41
-24
lines changed

lib/ios/RNNInsetsOptions.h

+2
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@
77
@property(nonatomic, strong) Double *right;
88
@property(nonatomic, strong) Double *bottom;
99

10+
- (UIEdgeInsets)edgeInsetsWithDefault:(UIEdgeInsets)defaultInsets;
11+
1012
@end

lib/ios/RNNInsetsOptions.m

+7
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,11 @@ - (void)mergeOptions:(RNNInsetsOptions *)options {
2424
self.right = options.right;
2525
}
2626

27+
- (UIEdgeInsets)edgeInsetsWithDefault:(UIEdgeInsets)defaultInsets {
28+
return UIEdgeInsetsMake([self.top getWithDefaultValue:defaultInsets.top],
29+
[self.left getWithDefaultValue:defaultInsets.left],
30+
[self.bottom getWithDefaultValue:defaultInsets.bottom],
31+
[self.right getWithDefaultValue:defaultInsets.right]);
32+
}
33+
2734
@end

lib/ios/RNNNavigationButtons.m

+9-15
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
#import "RNNComponentViewController.h"
55
#import "RNNFontAttributesCreator.h"
66
#import "RNNUIBarButtonItem.h"
7-
#import "UIImage+insets.h"
87
#import "UIImage+tint.h"
98
#import "UIViewController+LayoutProtocol.h"
109
#import <React/RCTConvert.h>
@@ -171,11 +170,8 @@ - (RNNUIBarButtonItem *)buildButton:(NSDictionary *)dictionary
171170
UIImage *iconImage = [[ImageParser parse:dictionary
172171
key:@"icon"] getWithDefaultValue:defaultIcon];
173172

174-
if (iconImage) {
175-
iconImage = [iconImage imageWithInsets:insets];
176-
if (color) {
177-
iconImage = [iconImage withTintColor:color];
178-
}
173+
if (color) {
174+
iconImage = [iconImage withTintColor:color];
179175
}
180176

181177
RNNUIBarButtonItem *barButtonItem;
@@ -191,7 +187,9 @@ - (RNNUIBarButtonItem *)buildButton:(NSDictionary *)dictionary
191187
reactViewReadyBlock:nil];
192188
barButtonItem = [[RNNUIBarButtonItem alloc] init:buttonId withCustomView:view];
193189
} else if (iconImage) {
194-
barButtonItem = [[RNNUIBarButtonItem alloc] init:buttonId withIcon:iconImage];
190+
barButtonItem = [[RNNUIBarButtonItem alloc] init:buttonId
191+
withIcon:iconImage
192+
withInsets:insets];
195193
} else if (title) {
196194
barButtonItem = [[RNNUIBarButtonItem alloc] init:buttonId withTitle:title];
197195

@@ -277,16 +275,12 @@ - (id)getValue:(id)value withDefault:(id)defaultValue {
277275
return value ? value : defaultValue;
278276
}
279277

280-
- (UIEdgeInsets)leftButtonInsets:(RNNInsetsOptions *)defaultInsets {
281-
return UIEdgeInsetsMake(
282-
[defaultInsets.top getWithDefaultValue:0], [defaultInsets.left getWithDefaultValue:0],
283-
[defaultInsets.bottom getWithDefaultValue:0], [defaultInsets.right getWithDefaultValue:15]);
278+
- (UIEdgeInsets)leftButtonInsets:(RNNInsetsOptions *)insets {
279+
return [insets edgeInsetsWithDefault:UIEdgeInsetsZero];
284280
}
285281

286-
- (UIEdgeInsets)rightButtonInsets:(RNNInsetsOptions *)defaultInsets {
287-
return UIEdgeInsetsMake(
288-
[defaultInsets.top getWithDefaultValue:0], [defaultInsets.left getWithDefaultValue:15],
289-
[defaultInsets.bottom getWithDefaultValue:0], [defaultInsets.right getWithDefaultValue:0]);
282+
- (UIEdgeInsets)rightButtonInsets:(RNNInsetsOptions *)insets {
283+
return [insets edgeInsetsWithDefault:UIEdgeInsetsZero];
290284
}
291285

292286
@end

lib/ios/RNNUIBarButtonItem.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77

88
@property(nonatomic, strong) NSString *buttonId;
99

10-
- (instancetype)init:(NSString *)buttonId withIcon:(UIImage *)iconImage;
10+
- (instancetype)init:(NSString *)buttonId
11+
withIcon:(UIImage *)iconImage
12+
withInsets:(UIEdgeInsets)edgeInsets;
1113
- (instancetype)init:(NSString *)buttonId withTitle:(NSString *)title;
1214
- (instancetype)init:(NSString *)buttonId withCustomView:(RCTRootView *)reactView;
1315
- (instancetype)init:(NSString *)buttonId withSystemItem:(NSString *)systemItemName;

lib/ios/RNNUIBarButtonItem.m

+20-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#import "RNNUIBarButtonItem.h"
22
#import "RCTConvert+UIBarButtonSystemItem.h"
3+
#import "UIImage+insets.h"
34
#import <Foundation/Foundation.h>
45
#import <UIKit/UIKit.h>
56

@@ -12,14 +13,25 @@ @interface RNNUIBarButtonItem ()
1213

1314
@implementation RNNUIBarButtonItem
1415

15-
- (instancetype)init:(NSString *)buttonId withIcon:(UIImage *)iconImage {
16-
UIButton *button = [[UIButton alloc] init];
17-
[button addTarget:self
18-
action:@selector(onButtonPressed)
19-
forControlEvents:UIControlEventTouchUpInside];
20-
[button setImage:iconImage forState:UIControlStateNormal];
21-
[button setFrame:CGRectMake(0, 0, iconImage.size.width, iconImage.size.height)];
22-
self = [super initWithCustomView:button];
16+
- (instancetype)init:(NSString *)buttonId
17+
withIcon:(UIImage *)iconImage
18+
withInsets:(UIEdgeInsets)edgeInsets {
19+
20+
if (UIEdgeInsetsEqualToEdgeInsets(edgeInsets, UIEdgeInsetsZero)) {
21+
self = [super initWithImage:iconImage
22+
style:UIBarButtonItemStylePlain
23+
target:nil
24+
action:nil];
25+
} else {
26+
UIButton *button = [[UIButton alloc] init];
27+
[button addTarget:self
28+
action:@selector(onButtonPressed)
29+
forControlEvents:UIControlEventTouchUpInside];
30+
[button setImage:[iconImage imageWithInsets:edgeInsets] forState:UIControlStateNormal];
31+
[button setFrame:CGRectMake(0, 0, iconImage.size.width, iconImage.size.height)];
32+
self = [super initWithCustomView:button];
33+
}
34+
2335
self.buttonId = buttonId;
2436
return self;
2537
}

0 commit comments

Comments
 (0)