2014-09-16 24 views
9

Trong iOS 8 có một vấn đề hoặc một tính năng. Khi MPVolumeView được hiển thị, nó đang được làm động, như mở rộng từ 0 đến chiều rộng của nó. Làm cách nào để khắc phục hành vi đó? Không có vấn đề như vậy trên iOS 7.MPVolumeView hình ảnh động trên iOS 8

+0

Yep, điều này chắc chắn trông giống như một lỗi. Nó chỉ xảy ra lần đầu tiên MPVolumeView dụ được thêm vào một superview. Nếu bạn xóa nó và thêm nó một lần nữa, nó sẽ chỉ xuất hiện như mong đợi. –

+0

tôi nộp một radar vài ngày trước cho vấn đề này: http://openradar.appspot.com/radar?id=5308200412774400 –

+3

tôi đã cùng một vấn đề và những gì giúp được subclassing MPVolumeView và phương pháp duy nhất trọng '- (CGRect) volumeSliderRectForBounds: (CGRect) giới hạn { giới hạn trả về; } '. Thật không may nó là một cách giải quyết mặc dù. Và tôi đã không kiểm tra làm thế nào nó hoạt động nếu nút tuyến đường (cho airplay ví dụ) nên được trình bày. Mặt khác, Apple không còn hiển thị nút này trong các ứng dụng, vì nó được trình bày trong Trung tâm điều khiển từ iOS7, vì vậy tôi cũng không hiển thị nó và cho tôi giải pháp này hoạt động tốt. – Anastasia

Trả lời

0

Tôi xác nhận rằng sự cố này vẫn tồn tại trong iOS 8. Giải pháp được cung cấp bởi Anastasia trong một trong các nhận xét ở trên (với khối lượng ghi đè) có vẻ hoạt động nhưng chỉ khi nút tuyến đường không hiện tại. Khi có mặt, thanh trượt sẽ chồng lên nút tuyến đường và nó không thể được nhấn nữa.

tôi đã thực hiện một thay đổi đơn giản của giải pháp của mình, có lẽ ai đó có thể sử dụng nó như một cách giải quyết, cho đến khi Apple sửa lỗi đó hoặc giải pháp tốt hơn được cung cấp.

- (CGRect)volumeSliderRectForBounds:(CGRect)bounds 
{ 
    if (self.showsRouteButton) { 
     NSInteger spacer = 10; /* Space between Route button and Volume slider */ 
     CGRect routeButtonRect = [self routeButtonRectForBounds:bounds]; 
     bounds.size.width -= (routeButtonRect.size.width + spacer); 
    } 
    return bounds; 
} 

Tôi không thích mã hóa cứng giá trị bộ đệm, nhưng tôi không thể tìm cách tính toán động.

2

Một cách có thể để loại bỏ hành vi này là phân lớp MPVolumeView và thực hiện một số công việc bổ sung sau [super layoutSubviews].

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    [self cg_recursiveRemoveAnimationsOnView:self]; 
} 

- (void)cg_recursiveRemoveAnimationsOnView:(UIView *)view 
{ 
    [view.layer removeAllAnimations]; 
    for (UIView *subview in view.subviews) { 
     [self cg_recursiveRemoveAnimationsOnView:subview]; 
    } 
} 

Thao tác này sẽ xóa tất cả hoạt ảnh được chèn. Vì vậy, hãy chắc chắn đó là những gì bạn muốn, vì đây là khá overkill. Người ta cũng có thể chỉ cần loại bỏ các positionbounds hình ảnh động (xem removeAnimationForKey:).

+0

Tại sao không sử dụng 'UIView.performWithoutAnimation' - đơn giản hơn nhiều –

+0

Bạn có nghĩa là gói' [siêu layoutSubviews] 'với' -performWithoutAnimation'? Điều này đã không làm việc như các hình ảnh động dường như được tạo ra ở nơi khác và cũng không phải mọi lớp trong MPVolumeView có một đại biểu 'UIView'. – CipherCom

+0

Nó sẽ thực hiện một chức năng tương tự như phương pháp của bạn. Nếu không, hoạt hình là một hoạt hình CA, thậm chí còn đặc biệt hơn. –

Các vấn đề liên quan