UIToolbar
に「戻る」左矢印ベゼルボタンを作成したいと思います。
私が知る限り、これらのいずれかを取得する唯一の方法は、UINavigationController
をデフォルト設定のままにして、左のバー項目に使用することです。しかし、変数をUIBarButtonItem
として作成する方法を見つけることはできないため、標準のUIToolbar
で作成することはできません。たとえ、UINavigationBar
sに非常に似ています。
ボタン画像で手動で作成できましたが、ソース画像がどこにも見つかりません。アルファチャンネルのエッジがあるため、スクリーンショットやカッティングは非常に多目的な結果にはなりません。
使用するあらゆるサイズと配色のスクリーンショットを超えるアイデアはありますか?
更新:質問を避け、これを尋ねるのではなく、UINavigationBar
を使用することを提案してください。私のアプリはInstapaper Proです。下部のツールバーのみを表示し(スペースを節約し、読み取り可能なコンテンツ領域を最大化するため)、下部に左矢印の「戻る」ボタンを配置したいと思います。
私はこれをする必要はないことを教えてください答えではありませんそして確かに報奨に値するものではありません。
http://www.teehanlax.com/blog/?p=447 から派生した次のpsdを使用しました
http://www.chrisandtennille.com/pictures/backbutton.psd
次に、ツールバー項目のcustomViewプロパティで使用するカスタムUIViewを作成しました。
私にとってはうまくいきます。
編集:PrairieHippo 、maralbjoは、次の簡単なコードを使用して、この回答と組み合わせる必要があるトリック(バンドルのカスタムイメージが必要)を見つけました。したがって、追加のコードは次のとおりです。
// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
style:UIBarButtonItemStyleBordered
target:self
action:@selector(backAction)];
tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
ユニコード文字を使用して作業を完了する方がはるかに簡単だと思います。 nicode Triangles または nicode Arrows のいずれかをグーグルして、矢印を見ることができます。 iOS6以降、Appleは、文字を枠付きの絵文字に変更しました。境界線を無効にするには、0xFE0E nicode Variation Selector を追加します。
NSString *backArrowString = @"\U000025C0\U0000FE0E"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.leftButtonItem = backBarButtonItem;
コードブロックはデモ用です。 NSStringを受け入れる任意のボタンで機能します。
文字の完全なリストについては、GoogleでUnicode文字と必要な文字を検索してください。 黒の左向き三角形 のエントリは次のとおりです。
警告:これはiOS 6では動作しないという報告があります。これは古いバージョンのOSでのみ動作する可能性があります。明らかに、少なくとも1人の開発者が、このトリックの使用を理由にアプリを拒否しました(コメントを参照)。自己責任。画像(上記の回答を参照)を使用すると、より安全なソリューションになる場合があります。
これは、sekr1tボタンタイプ101を使用して正しい形状を得るために独自の画像ファイルを追加せずに実行できます。私にとっては、initWithCustomView
を使用してBarButtonItem
を作成できると考えたのがトリックでした。私は個人的にはtoolbar
ではなく動的navbarにこれを必要としましたが、ツールバーでテストしましたが、コードはほぼ同じです:
// create button
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape!
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
// create button item -- possible because UIButton subclasses UIView!
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
// add to toolbar, or to a navbar (you should only have one of these!)
[toolbar setItems:[NSArray arrayWithObject:backItem]];
navItem.leftBarButtonItem = backItem;
ツールバーでこれを行う場合は、アイテムの設定方法を微調整する必要がありますが、それはコードの残りの部分に依存するため、読者の演習として残しておきます。 :Pこのサンプルは私のために働いた(コンパイルして実行)。
何とか、HIGを読んで、文書化されていない機能を使用しないでください。サポートされているボタンタイプは6つのみで、これはそのうちの1つではありません。
まず、戻るボタンの画像を見つける必要があります。 Extractor という素敵なアプリを使用して、iPhoneからすべてのグラフィックを抽出しました。 iOS7では、UINavigationBarBackIndicatorDefault
という画像を取得できましたが、赤い色合いが必要だったため、それは黒色でした Gimpを使用して色を赤に変更します。
編集:
btate が彼のコメントで言及したように、画像エディターで色を変更する必要はありません。次のコードでこのトリックを行う必要があります。
imageView.tint = [UIColor redColor];
imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
次に、その矢印の付いたimageView、カスタムテキストの付いたラベル、ビューの上部にアクションのあるボタンを含むビューを作成しました。次に、単純なアニメーション(フェードと変換)を追加しました。
次のコードは、アニメーションを含む戻るボタンの動作をシミュレートします。
-(void)viewWillAppear:(BOOL)animated{
UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"]];
[imageView setTintColor:[UIColor redColor]];
UILabel *label=[[UILabel alloc] init];
[label setTextColor:[UIColor redColor]];
[label setText:@"Blog"];
[label sizeToFit];
int space=6;
label.frame=CGRectMake(imageView.frame.Origin.x+imageView.frame.size.width+space, label.frame.Origin.y, label.frame.size.width, label.frame.size.height);
UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, label.frame.size.width+imageView.frame.size.width+space, imageView.frame.size.height)];
view.bounds=CGRectMake(view.bounds.Origin.x+8, view.bounds.Origin.y-1, view.bounds.size.width, view.bounds.size.height);
[view addSubview:imageView];
[view addSubview:label];
UIButton *button=[[UIButton alloc] initWithFrame:view.frame];
[button addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
[view addSubview:button];
[UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
label.alpha = 0.0;
CGRect orig=label.frame;
label.frame=CGRectMake(label.frame.Origin.x+25, label.frame.Origin.y, label.frame.size.width, label.frame.size.height);
label.alpha = 1.0;
label.frame=orig;
} completion:nil];
UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:view];
}
- (void) handleBack:(id)sender{
}
編集:
私の意見では、ボタンを追加する代わりに、ジェスチャレコグナイザーを使用するのがより良いアプローチです。
UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)];
[view addGestureRecognizer:tap];
[view setUserInteractionEnabled:YES];
これがうまくいくかどうかはわかりませんが、デフォルトの設定でUINavigationController
を作成して、ボタンを作成し、Navigation Controllerのサブビュー階層でボタンを見つけ、その上でremoveFromSuperview
を呼び出し、Navigation Controllerを破棄してから、ツールバーのサブビューとしてボタン。プロセス中に割り当てが解除されるのを避けるために、retain
を呼び出す前にremoveFromSuperview
とボタン(およびツールバーのサブビューとして追加した後、release
)も必要になる場合があります。
IOS 7システムの戻る矢印にかなり近い(私はデザイナーではありません)矢印付きのUIButtonを作成するには:
標準:
Apple SD Gothic Neo
Xcodeの場合:
参照 @ staticVoidMan's answer iOS 7のBack-like矢印に
画像ファイルに煩わされたくない場合は、次のコードを使用してUIViewサブクラスに矢印の形を描画できます。
- (void)drawRect:(CGRect)rect {
float width = rect.size.width;
float height = rect.size.height;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
CGContextMoveToPoint(context, width * 5.0/6.0, height * 0.0/10.0);
CGContextAddLineToPoint(context, width * 0.0/6.0, height * 5.0/10.0);
CGContextAddLineToPoint(context, width * 5.0/6.0, height * 10.0/10.0);
CGContextAddLineToPoint(context, width * 6.0/6.0, height * 9.0/10.0);
CGContextAddLineToPoint(context, width * 2.0/6.0, height * 5.0/10.0);
CGContextAddLineToPoint(context, width * 6.0/6.0, height * 1.0/10.0);
CGContextClosePath(context);
CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
CGContextFillPath(context);
}
矢印ビューは、幅6.0および高さ10.0に比例します
self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;
私のために働く。タブバーに収まるより多くのタブがあり、 "More"からプッシュされたView ControllerがviewDidLoadのleftBarButtonItemをオーバーライドしたときに、これを使用しました。
これらすべてのソリューションなどを検索した後、私がやったことは次のとおりです。 UIKitストック画像から抽出された伸縮可能なpngを使用します。このようにして、テキストを自由に設定できます
// Generate the background images
UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0];
UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
// Setup the UIButton
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal];
[backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected];
NSString *buttonTitle = NSLocalizedString(@"Back", @"Back");
[backButton setTitle:buttonTitle forState:UIControlStateNormal];
[backButton setTitle:buttonTitle forState:UIControlStateSelected];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position
NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left);
[backButton setFrame:CGRectMake(0, 0, width, 29)];
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f];
[backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown];
// Now add the button as a custom UIBarButtonItem
UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
self.navigationItem.leftBarButtonItem = backButtonItem;
Three20ライブラリには、これを行う方法があります。
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Title" style:UIBarButtonItemStylePlain
target:self action:@selector(foo)];
UIColor* darkBlue = RGBCOLOR(109, 132, 162);
TTShapeStyle* style = [TTShapeStyle styleWithShape:[TTRoundedLeftArrowShape shapeWithRadius:4.5] next:
[TTShadowStyle styleWithColor:RGBCOLOR(255,255,255) blur:1 offset:CGSizeMake(0, 1) next:
[TTReflectiveFillStyle styleWithColor:darkBlue next:
[TTBevelBorderStyle styleWithHighlight:[darkBlue shadow]
shadow:[darkBlue multiplyHue:1 saturation:0.5 value:0.5]
width:1 lightSource:270 next:
[TTInsetStyle styleWithInset:UIEdgeInsetsMake(0, -1, 0, -1) next:
[TTBevelBorderStyle styleWithHighlight:nil shadow:RGBACOLOR(0,0,0,0.15)
width:1 lightSource:270 next:nil]]]]]];
TTView* view = [[[TTView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)] autorelease];
view.backgroundColor = [UIColor clearColor];
view.style = style;
backButton.customView = view;
self.navigationItem.leftBarButtonItem = backButton;
次の簡単なコードを使用すると、うまくいくことがわかりました(バンドルのカスタムイメージが必要です)。
// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
style:UIBarButtonItemStyleBordered
target:self
action:@selector(backAction)];
tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];
UIKit $ {SDKROOT} /System/Library/Frameworks/UIKit.framework/Other.artworkのOther.artworkからソース画像を抽出することにより、ソース画像を見つけることができます。改造コミュニティには、それらを抽出するためのツールがいくつかあります here 。画像を抽出したら、必要に応じて色を変更してボタン画像として設定するコードを作成できます。派生したアートワークを埋め込んでいるので、実際にそのようなものを出荷できるかどうかは少し危険かもしれませんので、弁護士に相談したいかもしれません。
Interface Builder in Xcode 5.xで簡単に行えます
ツールバーおよびバーボタン項目 from Object libraryを使用
ボタンのAttributes inspector edit Image section withyour 戻るボタンの画像
完了!
同じことをしようとしていましたが、戻るボタンをナビゲーションバーに配置したかったのです。 (実際には戻るボタンが必要でした。これは戻るだけではないため、leftBarButtonItemプロパティを使用する必要がありました)。 AndrewSが提案したことを試してみましたが、UIButtonはUIBarButtonItemにキャストされていたため、ナビゲーションバーでは見た目がよくありませんでした。
しかし、私はこれを回避する方法を見つけました。実際には、UIButtonの下にUIViewを配置し、UIBarButtonItemのcustomViewを設定します。誰かがそれを必要とする場合のコードは次のとおりです。
// initialize button and button view
UIButton *backButton = [UIButton buttonWithType:101];
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)];
[backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButtonView addSubview:backButton];
// set buttonview as custom view for bar button item
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButtonItem;
// Push item to navigationbar items
[self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]];
UIToolbarの画像を作成するには、photoshopでpngを作成し、任意の色で白を配置し、alpha = 0の場合はそのままにします。
SDKは実際に作成したアイコンの周囲に境界線を配置し、何もしなくても白に変わります。
参照してください、これは進むボタン用にPhotoshopで作成したものです(明らかに戻るボタン用に入れ替えます)。
これがInterface Builderでの表示です
PNGを使用しないソリューション。これに基づくSO回答: iPhone TableViewセルのセルの右側に小さな矢印を追加
UITableViewCellを水平方向に反転させるだけです!
UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)];
// Add the disclosure
CGRect frm;
UITableViewCell *disclosure = [[UITableViewCell alloc] init];
disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1);
frm = self.btnBack.bounds;
disclosure.frame = CGRectMake(frm.Origin.x, frm.Origin.y, frm.size.width-25, frm.size.height);
disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
disclosure.userInteractionEnabled = NO;
[self.btnBack addSubview:disclosure];
// Add the label
UILabel *lbl = [[UILabel alloc] init];
frm = CGRectOffset(self.btnBack.bounds, 15, 0);
lbl.frame = frm;
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = @"BACK";
[self addSubview:lbl];
Swift 3の例で、右上に前ボタンと次ボタンがあります。
let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped))
let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped))
self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem]
さて、サイズごとに異なるボタンを用意する必要はありません。[UIImage stretchableImageWithLeftCapWidth:topCapHeight:]
を使用できますが、私が見つけたのはカスタム画像だけです。
Swift
// create button
var backButton = UIButton(type: 101)
// left-pointing shape!
backButton.addTarget(self, action: #selector(self.backAction), for: .touchUpInside)
backButton.setTitle("Back", for: .normal)
// create button item -- possible because UIButton subclasses UIView!
var backItem = UIBarButtonItem(customView: backButton)
// add to toolbar, or to a navbar (you should only have one of these!)
toolbar.items = [backItem]
navItem.leftBarButtonItem = backItem
同様の問題があり、1つのライブラリ PButton が出てきました。また、サンプルはボタンのような戻るナビゲーションボタンで、カスタマイズされたボタンのようにどこでも使用できます。
このようなもの:
自分で描画したくない場合は、文書化されていないクラスを使用できます:スタイル1のUINavigationButtonこれは、もちろん、アプリケーションの承認を停止する可能性があります.../John