2014-09-21 25 views
7

Działa świetnie na iOS 7, ale pozycja UIImageView zmienia się na iO8 jak obrazy poniżej. Pozycja rightCalloutAccessoryView przesuwa się w górnym prawym rogu.UIImageView jako objaśnienie w lewoCalloutAccessoryView automatycznie przesuwa lewy górny róg

Czy ktoś może pomóc?

Pozdrawiam.

w IOS 7

iOS 7

w IOS 8

iOS8

- (void) MapView (MKMapView *) MapView didSelectAnnotationView (MKAnnotationView *) widok {

if(![view.annotation isKindOfClass:[MKUserLocation class]]) { 

    UBAnnotation *selectedAnnotation = view.annotation; 

    NSURL * imageUrlAtIndex = [NSURL URLWithString:[[self.objects objectAtIndex:selectedAnnotation.idx] ad_thumbImageUrl]]; 


    UIImageView * leftCalloutView = [[UIImageView alloc] initWithFrame:CGRectMake(2, 2, 40, 40)]; 
    [leftCalloutView setImageWithURL:imageUrlAtIndex]; 
    leftCalloutView.layer.masksToBounds = YES; 
    leftCalloutView.layer.cornerRadius = 6; 

    view.leftCalloutAccessoryView = leftCalloutView; 

} 

}

- (MKAnnotationView *) MapView (MKMapView *) MapView viewForAnnotation (ID) Adnotacja {

MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentloc"]; 

if ([annotation isKindOfClass:[MKUserLocation class]]) { 
    return nil; 
} else { 
    annView.image = [UIImage imageNamed:@"pin"]; 

    annView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    annView.rightCalloutAccessoryView.tintColor = [UBColor ubGreenColor]; 
    annView.animatesDrop= NO; 
    annView.canShowCallout = YES; 

} 

return annView; 

}

Odpowiedz

6

że rozwiązany!

Chodzi o długość łańcucha titleLabel. Jeśli długość ciągu przekracza 20-25 znaków, widok lewego i prawego elementu akcesoriów przesuwa się w górę.

Najpierw przycięłam ciąg znaków widoczny na etykiecie tytułowej lub podtytule. Po, połącz "..." jako ciąg na końcu ciągu.

Rozwiązanie jest trochę hackowe, ale działa jak urok.

+2

To brzmi jak błąd w systemie iOS 8, jeśli trzeba to naprawić. – Ramis

+2

"LeftCalloutAccessoryView" ma ustawiony autolayout tak, że jego lewy margines i górny margines są takie same. I jest wyśrodkowany pionowo z priorytetem "250". Jednak priorytetem odporności na ściskanie etykiety jest "750". Jeśli etykieta ma zostać obcięta, spowoduje to przesunięcie lewego widoku objaśnienia w lewo, co spowoduje przesunięcie w górę. –

0

Tak naprawiłem. Wymaga polerowania kodu, ale dla mnie działa.

- (UIView*)rightCalloutAccessoryView { 
    UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    return [self parentViewForView:rightButton]; 
} 

- (UIView*)parentViewForView:(UIView*)view { 
#ifdef __IPHONE_8_0 
    CGRect rr = view.frame; 
    rr.origin.x = 2.0f; 
    rr.origin.y = (64.0f - rr.size.height)/2.0f; 
    view.frame = rr; 
    UIView *result = [[UIView alloc] initWithFrame:CGRectMake(0, 0, rr.size.width + 4.0f, 64.0f)]; 
    [result addSubview:view]; 
    return result; 
#else 
    return view; 
#endif 
} 
0

Jeśli chcesz dostosować leftCalloutAccessoryView zostać wdrożony customizedView że trzeba udoskonalić szerokość była pod 225.0f (lepszy setup jest 220.0f) na iPhone 4, 4S, 5, 5+.

na przykład:

UIView *_customContentView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 225.0f, 38.0f)]; 
view.leftCalloutAccessoryView = _customContentView; 

To moje doświadczenie rozwiązany.