Как удалить закругленные углы из UINavigationBar и UIToolbar с пользовательскими фоновыми изображениями? - PullRequest
1 голос
/ 15 августа 2011

В приложении iPad на основе разделенного вида я использую пользовательское фоновое изображение на своих панелях навигации и панелях инструментов.Я вложил в подкласс UINavigationBar и / или UIToolbar и в drawRect: у меня есть ( background-image прямоугольный):

- (void)drawRect:(CGRect)rect {
    CGContextRef c = UIGraphicsGetCurrentContext();
    UIImage *image = [UIImage imageNamed:@"background-image"];    

    CGContextDrawImage(c, rect, image.CGImage);
}

Результат равен Rounded corners, из которого я хочуубрать закругленные углы.

То, что я уже пробовал:

  1. [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; тот же результат, что и выше,
  2. clipsToBounds = YES; в моих подклассах,
  3. cornerRadius=0.0,
  4. iPhoneOS SDK - удаление скругления углов из представлений (проблема с iPad)

Проблема, описанная в 4. является точнотот же, который у меня есть.К сожалению, решение, описанное в этом вопросе, не работает для меня.При вызове из viewWillAppear В книжной ориентации он почему-то скрывает мой элемент навигации.При вызове из didRotateFromInterfaceOrientation: в альбомной ориентации закругленные углы исчезают, но в то же время все взаимодействие с пользователем отключено.Кроме того, при повороте назад в «Портрет» мой «главный» вид (слева от разделенного вида) не скрыт.

Вывод, полученный с использованием кода из принятого ответа:

aView: <UIWindow: 0x5e18470; frame = (0 0; 768 1024); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x5e18280>>
subview: <UILayoutContainerView: 0x6942000; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x6946b30>>
aView: <UILayoutContainerView: 0x6942000; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = W+H; layer = <CALayer: 0x6946b30>>
subview: <BackgroundImageView: 0xbbacf70; frame = (0 0; 768 1004); layer = <CALayer: 0xbbad020>>
aView: <BackgroundImageView: 0xbbacf70; frame = (0 0; 768 1004); layer = <CALayer: 0xbbad020>>
subview: <UILayoutContainerView: 0x69144e0; frame = (321 0; 703 748); clipsToBounds = YES; layer = <CALayer: 0x6946fe0>>
aView: <UILayoutContainerView: 0x69144e0; frame = (321 0; 703 748); clipsToBounds = YES; layer = <CALayer: 0x6946fe0>>
subview: <UILayoutContainerView: 0xbbabc40; frame = (0 0; 320 748); clipsToBounds = YES; layer = <CALayer: 0xbbabc90>>
aView: <UILayoutContainerView: 0xbbabc40; frame = (0 0; 320 748); clipsToBounds = YES; layer = <CALayer: 0xbbabc90>>
subview: <UIImageView: 0x5e178c0; frame = (321 0; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60d10>> - (null)
aView: <UIImageView: 0x5e178c0; frame = (321 0; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60d10>> - (null)
subview: <UIImageView: 0xba74010; frame = (317 0; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba62180>> - (null)
aView: <UIImageView: 0xba74010; frame = (317 0; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba62180>> - (null)
subview: <UIImageView: 0xbad0110; frame = (321 745; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60da0>> - (null)
aView: <UIImageView: 0xbad0110; frame = (321 745; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60da0>> - (null)
subview: <UIImageView: 0xba60e00; frame = (317 745; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60e30>> - (null)
aView: <UIImageView: 0xba60e00; frame = (317 745; 3 3); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xba60e30>> - (null)

И совершенно верно, есть маленькие, 3x3px, округленные UIImageViews с углами.

Вопрос : как мне избавиться от этих крошечных закругленных углов?

1 Ответ

2 голосов
/ 25 января 2012

Решение, которое сработало для меня:

- (void)hideSplitViewCorners {
// Hide corners of splitview.
NSMutableArray *views = [NSMutableArray array];
[views addObject:[self view]];

for (NSUInteger i = 0; i < views.count; ++i) {
    UIView *view = [views objectAtIndex:i];
    [views addObjectsFromArray:view.subviews];

    if (view.frame.size.width == 3.0 && view.frame.size.height == 3.0) {
        view.hidden = YES;
    }
  }    
}

Я называю это в loadView и didRotateFromInterfaceOrientation: моего подкласса UISplitViewController.Обратите внимание, что в последнем случае мне нужно было использовать [self performSelector:@selector(hideSplitViewCorners) withObject:NULL afterDelay:0];.

. В основном нужно убедиться, что скрытие этих углов выполнено после того, как они уже отображаются на экране.

...