在iPhone应用程序中,我们可以使用以下代码制作UIBarButtonItem:
UIBarButtonItem *bbix=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
生成的UIBarButtonItem有一个系统提供的“action”图标。我的问题是:如何获取这个UIBarButtonItem的内部UIButton并将此UIButton添加到另一个UIView?谁可以给我看一些代码?
答案 0 :(得分:12)
你做不到。 UIBarButtonItem
继承自UIBarItem
继承的NSObject
。这些类中没有一种方法可以获得UIButton
,因为UIBarButtonItem
不是UIButton
。
相反,您可以从UIBarButtonItem
创建UIButton
- 请参阅an answer I gave to a different question了解更多信息(通过将其添加为“自定义视图”)。
答案 1 :(得分:6)
访问" customView" bar按钮项的属性是一种可能的解决方案:
UIBarButtonItem *item = (UIBarButtonItem *)[self.navigationItem.rightBarButtonItems objectAtIndex:0];
OR
UIBarButtonItem *item = (UIBarButtonItem *)[self.navigationItem.rightBarButtonItem];
UIButton *myBtn;
if([item.customView isKindOfClass:[UIButton class]])
{
myBtn = (UIButton*)item.customView;
}
if(myBtn)
{
// do something
}
试一试。它真的对我有用:)
答案 2 :(得分:3)
我不认为你可以在任何情况下获得嵌入式按钮。但是,如果您使用自定义视图创建按钮(例如,使用按钮),我们稍后可以使用此代码获取该按钮:
((UIButton *)(theBarButtonItem.customView.subviews.lastObject));
自定义视图的层次结构应如下所示:
|--UIView
|--UIButton
|--UIImageView
希望有所帮助。
答案 3 :(得分:1)
您无法通过UIBarButtonItem访问UIBarButtonItem中的嵌入按钮
您可以使用界面构建器将内部按钮与新插座链接,这样您可以直接访问按钮 打开nib文件时可以在对象视图中找到按钮,然后可以将其与新插座链接
答案 4 :(得分:0)
如果您的UIBarButton是使用自定义视图制作的,只是为了扩展Brians的答案......
if ([myBarButton.customView.subviews.lastObject isKindOfClass:[UIButton class]])
{
UIButton * btn = ((UIButton *)(myBarButton.customView.subviews.lastObject));
}
只需添加一些错误检查,您永远不会知道苹果或其他开发人员何时会改变布局层次结构。由于这种方法在长期内确实容易出错。
答案 5 :(得分:0)
如果您已通过initWithCustomView创建了条形按钮项,只需访问自定义视图属性并转换为UIButton。
答案 6 :(得分:0)
这是一个精确复制UIBarButtonItem
图像的解决方案,否则将使用UIBarButtonSystemItemAction
系统类型获取该图像。例如,新创建的UIButton将插入MKAnnotationView
:
创建包含此方法的类别文件:
@implementation UIImage (Custom)
+ (UIImage *)actionButtonImage
{
CGRect rect = CGRectMake(0, 0, 20, 27);
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0);
[[UIColor colorWithRed:3/255.0 green:122/255.0 blue:1 alpha:1] set];
UIBezierPath *path = [UIBezierPath bezierPath];
// Box
[path moveToPoint:CGPointMake(7, 8)];
[path addLineToPoint:CGPointMake(1, 8)];
[path addLineToPoint:CGPointMake(1, 26)];
[path addLineToPoint:CGPointMake(19, 26)];
[path addLineToPoint:CGPointMake(19, 8)];
[path addLineToPoint:CGPointMake(13, 8)];
// Arrow shaft
[path moveToPoint:CGPointMake(10, 17)];
[path addLineToPoint:CGPointMake(10, 1)];
// Arrow head
[path moveToPoint:CGPointMake(6, 4.5)];
[path addLineToPoint:CGPointMake(10, 0.5)];
[path addLineToPoint:CGPointMake(14, 4.5)];
[path stroke];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
@end
在MKMapView
委托中,添加此实现(根据需要进行调整):
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
MKPinAnnotationView *view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Item"];
view.canShowCallout = YES;
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *actionImage = [UIImage actionButtonImage];
[button setImage:actionImage forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, actionImage.size.width, actionImage.size.height);
view.leftCalloutAccessoryView = button;
return view;
}