8

iPhoneアプリでは、次のコードを使用してUIBarButtonItemを作成できます。

UIBarButtonItem *bbix=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];

生成されたUIBarButtonItemには、システムが提供する「アクション」アイコンがあります。私の質問は、このUIBarButtonItemの内部UIButtonを取得し、このUIButtonを別のUIViewに追加する方法です。誰が私にコードを見せてくれますか?

4

7 に答える 7

12

できません。UIBarButtonItemからUIBarItem継承しNSObjectます。UIButtonはではないため、これらのクラスにはいずれもを取得するメソッドUIBarButtonItemがありませんUIButton

逆に、UIBarButtonItemからを作成することもできます。詳細については、別の質問に対する回答をUIButton参照してください(これは、「カスタムビュー」として追加することで機能します)。

于 2010-06-13T08:11:29.403 に答える
6

バーボタンアイテムの「customView」プロパティにアクセスすることは、考えられる解決策の1つです。

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
}

これを試してみてください。それは本当に私のために働きます:)

于 2014-09-20T03:54:34.923 に答える
3

いずれにせよ、埋め込みボタンを入手できるとは思いません。ただし、ボタンを使用するなど、カスタムビューを使用してボタンを作成した場合、後で次のコードを使用してそのボタンを取得できます。

((UIButton *)(theBarButtonItem.customView.subviews.lastObject));

カスタムビューの階層は次のようになります。

|--UIView
  |--UIButton
  |--UIImageView

お役に立てば幸いです。

于 2013-07-02T17:46:24.207 に答える
1

UIBarButtonItemを介してUIBarButtonItem内に埋め込まれたボタンにアクセスすることはできません

インターフェイスビルダーを使用して内側のボタンを新しいアウトレットにリンクするためにできることこのように、ボタンに直接アクセスできます。nibファイルを開くと、オブジェクトビュー内のボタンを見つけて、リンクすることができます。新しいアウトレット

于 2013-08-07T10:25:44.957 に答える
0

UIBarButtonがカスタムビューで作成されている場合は、Briansの回答を拡張するだけです...

if ([myBarButton.customView.subviews.lastObject isKindOfClass:[UIButton class]])
{
    UIButton * btn = ((UIButton *)(myBarButton.customView.subviews.lastObject));
}

エラーチェックを少し追加するだけで、Appleや他の開発者がいつかレイアウト階層を変更するかどうかはわかりません。このアプローチは本当に長期的にエラーが発生しやすいので。

于 2014-03-28T15:48:43.777 に答える
0

initWithCustomViewを使用してバーボタンアイテムを作成した場合は、カスタムビュープロパティにアクセスしてUIButtonにキャストするだけです。

http://cocoatouch.blog138.fc2.com/blog-entry-214.html

于 2014-04-23T14:56:05.637 に答える
0

これは、システムタイプUIBarButtonItemを使用して取得された画像を正確に複製するソリューションです。例として、新しく作成されたUIButtonが:UIBarButtonSystemItemActionに挿入されます。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;
}
于 2015-08-03T11:32:14.533 に答える