2016-08-25 29 views
28

przeszedłem do mojego projektu nad nowymi wersjami beta iOS 10 i XCode 8. We wszystkich trzech obszarach mojego app gdzie używam:clipsToBounds powoduje UIImage aby nie wyświetlać w iOS10 & XCode 8

imageView.layer.cornerRadius = imageView.frame.size.width/2 
imageView.clipsToBounds = true 

Związane obrazy nie wyświetlają się wcale. Podjęto próbę oczyszczenia projektu, a także folderu kompilacji, ponownego uruchomienia urządzenia, próbowania różnych symulatorów, ponownego dodania obrazu, programowego ustawienia skojarzonego UIImage zamiast wybierania jednego z zasobów.

Po usunięciu linii clipsToBounds wyświetlany jest prostokątny obraz niezależnie od tego, czy masksToBounds jest true lub false. Jak utworzyć okrągły obraz w XCode8/iOS10?

Edytuj: Projekt jest Swift 2.x i nie został jeszcze zaktualizowany do składni Swift 3.0.

+0

więc wyjęciu clipsToBounds ustawień oświadczenie, to czy cornerRadius zatrzymać wpływając na ImageView i obraz staje się ponownie prostokątny? – ddb

+0

@ddb tak, po usunięciu instrukcji clipsToBounds, obraz jest prostokątny i jest widoczny. – cloudcal

+1

Ta odpowiedź: http://stackoverflow.com/questions/39380128/ios-10-gm-with-xcode-8-gm-causes-views-to-disappear-due-to-roundedcorners sugeruje wywoływanie self.layoutIfNeeded –

Odpowiedz

0

To może być problem z układem. Ustawienie wartości false naspowoduje wyświetlenie obrazu, nawet jeśli jego rozmiar wynosi zero. Czy możesz wydrukować frame swoich zdjęć?

Jeśli ustawisz właściwości cornerRadius i clipToBounds w viewDidLoad, spróbuj zrobić to w viewDidLayoutSubviews().

Możesz również spróbować zadzwonić pod numer self.view.layoutIfNeeded().

+0

Początkowo próbowałem ustawić promień narożnika i clipsToBounds w viewDidLoad i viewDidAppear bez żadnego wyniku. Próbowałem z viewDidLayoutSubviews bezskutecznie, jak również. Po wejściu do hierarchii widoku debugowania widzę ramkę dla obiektu UII w ramach rysowania UIImageView - po prostu brak obrazu. Warto również wspomnieć (zapomniałem w swoim oryginalnym wpisie), że projekt wciąż jest Swift 2.x i nie został zaktualizowany do składni Swift 3.0. – cloudcal

+0

drukowanie plonów ramki: (137.5, 24.0, 100.0, 100.0) – cloudcal

-1

Należy zadzwonić layoutSubviews() na głównym widoku przed wywołaniem imageView.frame.size.width

[self.view layoutSubviews]; 
imageView.layer.cornerRadius = imageView.frame.size.width/2 
imageView.clipsToBounds = true 
+0

Nigdy nie powinieneś ręcznie wywoływać 'layoutSubviews'. Zadzwoń pod 'layoutIfNeeded' zamiast – Thorax

6

Ten problem się również do mnie.

Przeniosłem ten kod imageView.layer.cornerRadius = imageView.frame.size.width/2 z - (void)awakeFromNib na - (void)drawRect:(CGRect)rect i ten problem zniknął.

Mój imageView jest sortowany według autolayout. Wydaje mi się, że wysokość i szerokość nie są ustalane podczas budzenia ze stalówki na iOS 10.

+0

Pracował dla mnie! dzięki –

+0

omg .. takie proste soultion .. +1 .. dzięki :) –

0

Używając funkcji obj-c, przeniesiono składnię z viewDidLoad na viewDidLayoutSubviews.

0

Właśnie realizowany kantów jak ten

@implementation RoundImageView 

- (instancetype)initWithCoder:(NSCoder *)coder 
{ 
    self = [super initWithCoder:coder]; 
    if (self) { 
     self.layer.masksToBounds = YES; 
     self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; 
     [self addObserver:self 
       forKeyPath:@"bounds" 
        options:NSKeyValueObservingOptionNew 
        context:(__bridge void * _Nullable)(self)]; 
    } 
    return self; 
} 

-(void)dealloc 
{ 
    [self removeObserver:self 
       forKeyPath:@"bounds" 
       context:(__bridge void * _Nullable)(self)]; 
} 

-(void)observeValueForKeyPath:(NSString *)keyPath 
        ofObject:(id)object 
         change:(NSDictionary<NSString *,id> *)change 
         context:(void *)context 
{ 
    if(context == (__bridge void * _Nullable)(self) && object == self && [keyPath isEqualToString:@"bounds"]) 
    { 
     self.layer.cornerRadius = MIN(self.bounds.size.height, self.bounds.size.width)/2; 
    } 
} 

@end 

więc zawsze zostały odpowiednio zaokrąglone narożniki. I nie miałem problemów z aktualizacją do iOS10 i XCode8

0

Myślę, że problem występuje, ponieważ ustawiamy zaokrąglony róg i klipy podprzestrzeni jako @Pranoy C powiedział.

Rozwiązałem problemy za pomocą layoutIfNeeded dla mojej komórki widoku tabeli, pokazując zdjęcie profilowe użytkownika.Chcę się upewnić, że obraz jest zaokrąglony.

Kod jest następujący: - (void) awakeFromNib { [super obudzić FromNib]; [self layoutIfNeeded];

[self.inputIndicator_imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
self.profile_pic_edit_imageView.layer.cornerRadius = self.profile_pic_edit_imageView.frame.size.width/2; 
self.profile_pic_edit_imageView.layer.borderWidth = 1.0; 
self.profile_pic_edit_imageView.layer.borderColor = GRAY_COLOR_SUPER_LIGHT.CGColor; 
self.profile_pic_edit_imageView.clipsToBounds = YES;} 
1

Miałem ten sam problem. Nie wyświetla się na telefonie, ale jest idealny na platformie Storyboard i debugge UI. Pracował także, kiedy projekt "Otwiera się z Xcode 7" zamiast 8, ale nie był satysfakcjonującym rozwiązaniem. Więc wykopałem i odkryłem problem. Kłopot był z klasą wygląda tak:

@IBDesignable public class MyButton: UIButton { 

    @IBInspectable var styleName: String = "" { 
     didSet { 
      switch styleName { 
      case "RoundedLight": 
       tintColor = UIColor.lightPinkColor() 
       layer.borderColor = UIColor.whiteColor().CGColor 
       layer.borderWidth = 1 
       layer.masksToBounds = true 
      default: 
       break 
      } 
     } 
    } 

    override public func layoutSubviews() { 
     super.layoutSubviews() 

     switch styleName { 
      case "RoundedLight": 
       layer.cornerRadius = frame.height/2 
      default: 
       break 
     } 
    } 
} 

Zmieniłem go do tego i działa teraz:

@IBDesignable public class MyButton: UIButton { 

    @IBInspectable var styleName: String = "" { 
     didSet { 
      layoutIfNeeded() 
     } 
    } 

    override public func layoutSubviews() { 
     super.layoutSubviews() 

     switch styleName { 
     case "RoundedLight": 
      tintColor = UIColor.lightPinkColor() 
      layer.borderColor = UIColor.whiteColor().CGColor 
      layer.borderWidth = 1 
      layer.cornerRadius = frame.height/2 
      layer.masksToBounds = true 
     default: 
      break 
     } 
    } 
} 

Należy pamiętać, że żaden z powyższych pracował dla mnie, a ja mówię:

  • Wywołanie layoutIfNeeded w layoutSubviews()
  • Wywołanie layoutIfNeeded w awakeFromNib mojego przycisku (lub moja komórka zawierająca przycisk)
  • Wywołanie layoutIfNeeded w layoutSubview mojej komórce
  • Wywołanie contentView.layoutIfNeeded() w awakeFromNib mojej komórce
  • Wywołanie view.layoutIfNeeded() moim zdaniem regulatora
2

to brzmi Może to być spowodowane nowym błędem, ponieważ iOS 10 i Xcode 8, w których widoki są inicjowane w rozmiarze 1000x1000, a przy próbie ustawienia promienia narożnika na pół ramki, ustawia się go na 500 zamiast tego. Zostało to udokumentowane w tym pytaniu tutaj: Since Xcode 8 and iOS10, views are not sized properly on viewDidLayoutSubviews. Mój powód, dla którego myślę, że to jest poprawka do wydania 1000x1000, powoduje wywołanie podpowierzchni układu przed wykonaniem czegokolwiek, co wymaga rozmiarów dla czegoś, co zostało zbudowane na konstruktorze interfejsów.

1

Miałem ImageView, który jest w pełni okrągły. Poniżej znajduje się kod:

//MARK:- Misc functions 
func setProfileImage() { 
    imgProfile.layer.masksToBounds = false 
    imgProfile.layer.cornerRadius = imgProfile.frame.size.height/2 
    imgProfile.clipsToBounds = true 
    imgProfile.contentMode = UIViewContentMode.ScaleToFill 
} 

Działa to dobrze w iOS 9. Jednakże, in iOS 10 Xcode 8 the ImageView disappears. Po debugowania okazało się, że ClipsToBound jest winowajcą.

Po umieszczeniu kodu w numerze viewDidLayoutSubviews() rozwiązano problem.

override func viewDidLayoutSubviews() { 
    setProfileImage() 
} 

Można również użyć self.view.layoutIfNeeded()