Ответ 1
Лучшее, что вы можете сделать, это использовать
[helloToolbar setBarStyle:UIBarStyleBlack];
[helloToolbar setTranslucent:YES];
Это даст вам черную, но полупрозрачную панель инструментов.
Я пробую следующий код, но он не работает.
[helloToolbar setBackgroundColor:[UIColor clearColor]];
Лучшее, что вы можете сделать, это использовать
[helloToolbar setBarStyle:UIBarStyleBlack];
[helloToolbar setTranslucent:YES];
Это даст вам черную, но полупрозрачную панель инструментов.
Чтобы сделать полностью прозрачную панель инструментов, используйте описанный здесь метод . В двух словах создайте новый класс TransparentToolbar
, который наследует UIToolbar, и используйте это вместо UIToolbar.
TransarentToolbar.h
@interface TransparentToolbar : UIToolbar
@end
TransarentToolbar.m
@implementation TransparentToolbar
// Override draw rect to avoid
// background coloring
- (void)drawRect:(CGRect)rect {
// do nothing in here
}
// Set properties to make background
// translucent.
- (void) applyTranslucentBackground
{
self.backgroundColor = [UIColor clearColor];
self.opaque = NO;
self.translucent = YES;
}
// Override init.
- (id) init
{
self = [super init];
[self applyTranslucentBackground];
return self;
}
// Override initWithFrame.
- (id) initWithFrame:(CGRect) frame
{
self = [super initWithFrame:frame];
[self applyTranslucentBackground];
return self;
}
@end
(код из сообщения блога, связанного выше)
В iOS 5 просто вызовите setBackgroundImage и передайте прозрачное изображение.
Вот как я это делаю (я динамически генерирую прозрачное изображение):
CGRect rect = CGRectMake(0, 0, 1, 1);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *transparentImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[toolbar setBackgroundImage:transparentImage forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
Прозрачный (iOS 5.0):
[toolbar setBackgroundImage:[[UIImage alloc] init] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
полупрозрачный:
[toolbar setBarStyle:UIBarStyleBlack];
[toolbar setTranslucent:YES];
Накопительное решение для всех устройств от самого старого iOS 3.0 (iPhone 1) до новейшего iOS 6.1 (iPad mini).
@implementation UIToolbar (Extension)
- (void)drawRect:(CGRect)rect
{
if (CGColorGetAlpha(self.backgroundColor.CGColor) > 0.f)
{
[super drawRect:rect];
}
}
- (void)setTransparent
{
//iOS3+
self.backgroundColor = [UIColor clearColor];
//iOS5+
if ([self respondsToSelector:@selector(setBackgroundImage:forToolbarPosition:barMetrics:)])
{
[self setBackgroundImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny barMetrics:UIBarMetricsDefault];
}
//iOS6+
if ([self respondsToSelector:@selector(setShadowImage:forToolbarPosition:)])
{
[self setShadowImage:[[UIImage new] autorelease] forToolbarPosition:UIToolbarPositionAny];
}
}
@end
Если вы хотите прозрачную панель инструментов, вызовите setTransparent
.
Если вы хотите создать непрозрачную панель инструментов, установите для нее backgroundColor или добавьте изображениеView самостоятельно.
Другим решением будет определение категории для UIToolbar:
@implementation UIToolbar(Transparent)
-(void)drawRect:(CGRect)rect {
// do nothing in here
}
@end
В IB установите панель инструментов как черный прозрачный и непрозрачный.
Мы только что заметили, что переопределение drawRect больше не работает с iOS 4.3. Он больше не называется (редактирование: похоже, только в Simulator). Вместо drawLayer: inContext: вызывается.
Отличное решение было опубликовано здесь
Теперь вы можете настроить каждый объект UIToolbar прозрачным, установив его tintColor на [UIColor clearColor]:)
В iOS 5 работает следующее:
UIToolbar *bar = [[UIToolbar alloc] initWithFrame:CGRectZero];
if (bar.subviews.count > 0)
[[[bar subviews] objectAtIndex:0] removeFromSuperview];
Это потому, что фон теперь является подвью. Этот код безопасен даже при новых итерациях iOS, но он может перестать работать. Это не закрытое использование API, ваше приложение безопасно отправить в хранилище.
Удостоверьтесь, что вы удалили backgroundView перед добавлением на панель UIBarButtonItem
. Или мой код не будет работать.
Я только что протестировал следующее с iOS 4.3 на симуляторе и телефоне, кажется, работает нормально. Подкласс UIToolbar предоставляет один метод:
- (void)drawRect:(CGRect)rect
{
[[UIColor colorWithWhite:0 alpha:0.6f] set]; // or clearColor etc
CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
}
toolbar.barStyle = UIBarStyleBlackTranslucent;
Это работает в iOS5.1 с минимальными усилиями. Я сопоставляю размер, так как только фон будет иметь тот же размер кадра, что и сама панель инструментов. Конечно, вы можете использовать другие критерии.
Enjoy.
Создайте подкласс UIToolbar следующим образом:
.h:
#import <UIKit/UIKit.h>
@interface UIClearToolbar : UIToolbar
@end
.m:
#import "UIClearToolbar.h"
@implementation UIClearToolbar
- (void)layoutSubviews {
// super has already laid out the subviews before this call is made.
[self.subviews enumerateObjectsUsingBlock:^(UIView* obj, NSUInteger idx, BOOL *stop) {
if (CGSizeEqualToSize(self.frame.size, obj.frame.size) ||
self.frame.size.width <= obj.frame.size.width) { // on device, the background is BIGGER than the toolbar.) {
[obj removeFromSuperview];
*stop = YES;
}
}];
}
@end
Спасибо @morais за ваше решение - здесь код переведен в MonoTouch:
public class TransparentToolbar : UIToolbar
{
public TransparentToolbar()
{
init();
}
public TransparentToolbar(RectangleF frame) : base(frame)
{
init();
}
void init()
{
BackgroundColor=UIColor.Clear;
Opaque=false;
Translucent=true;
}
public override void Draw(RectangleF rect)
{
}
}