2009-09-17 42 views
9

Tôi muốn vô hiệu hóa các nhấp chuột gây phiền nhiễu mà UIPickerView tạo ra khi cuộn lên và xuống. Có cách nào để làm việc này không? Tôi muốn phát những âm thanh ngắn cho mỗi mục mà người chọn xem theo dõi. Nó bị hủy hoại bởi âm thanh tích hợp.Tôi có thể tắt âm thanh cuộn UIPickerView không?

Tôi hiểu rằng âm thanh bộ chọn có thể được tắt trên toàn cầu bằng cách tắt âm thanh bàn phím trong cài đặt iPhone/iPod. Nhưng có cách nào để lập trình làm điều này không?

Mọi trợ giúp sẽ được đánh giá cao!

Cảm ơn

Trả lời

2

Sau khi sử dụng api không có giấy tờ cụ thể này trong hơn một năm trên App Store, Apple cuối cùng đã yêu cầu tôi xóa nó khỏi Ứng dụng của tôi. Nó rất bực bội cho các ứng dụng âm thanh có âm thanh nhấp chuột chết tiệt đó. Lời khuyên tốt nhất là chia sẻ với người dùng rằng âm thanh bộ chọn có thể bị vô hiệu hóa trên toàn cầu trong ứng dụng cài đặt trong "Âm thanh" và đặt "Số lần nhấp bàn phím" thành "Tắt". Tôi cũng khuyên bạn nên truy cập https://bugreport.apple.com/ và gửi lỗi cho UIPickerView, vì nó có thể gây biến dạng trong các ứng dụng âm thanh khi nhấp chuột chọn được phát.

1

Có một không có giấy tờ chiều (Tôi thực sự không chắc chắn nếu nó vẫn còn có sẵn trong iphone 3.0) nhưng ở đây nó là bất kỳ cách nào

#import <UIKit/UIKit.h> 

@interface SilintUIPickerView: UIPickerView 
{ } 

- (void) setSoundsEnabled: (BOOL) enabled; 
@end 

sử dụng lớp này để thay thế và hãy gọi [view setSoundsEnabled: NO]

Tôi muốn biết cách thức hoạt động trong SDK mới nhất, cung cấp cho nó một shot và cho chúng tôi biết.

+0

hoạt động hoàn hảo! cảm ơn bạn rất nhiều!! Nhân tiện, bạn có biết Apple đặc biệt như thế nào với API không được đăng ký không? Điều này cần sớm được tung vào cửa hàng ứng dụng. Sẽ không muốn bị từ chối và bị từ chối vì một thứ quá nhỏ :) – infiniteloop

+0

"Nhân tiện, bạn có biết Apple đặc biệt với API không có giấy tờ không đẹp mắt không?" Tôi thực sự không biết câu trả lời cho câu hỏi đó, hãy thử tìm kiếm nó trên SO và nếu nó chưa được hỏi, hãy hỏi nó. – hhafez

+0

Hiện tại, họ cảnh báo bạn nếu bạn sử dụng phương pháp này. –

2

họ vừa từ chối một ứng dụng của tôi vì sử dụng api không có giấy tờ ... đó là một trong số đó.

7

Tôi đã đấu tranh với vấn đề âm thanh UIPickerView và mặc dù nó chỉ liên quan một phần đến câu hỏi ban đầu, tôi đăng vấn đề/giải pháp ở đây vì chủ đề này tiếp tục xuất hiện trong kết quả tìm kiếm của tôi khác trong cùng một thuyền cũng có thể kết thúc ở đây…

Tôi cần khởi tạo UIPickerView để khôi phục hàng hiện được chọn từ dữ liệu đã lưu. Đơn giản, phải không? Trong viewDidLoad, chỉ cần gọi các selectRow: inComponent: Phương pháp hoạt hình của UIPickerView:

[myPicker selectRow:currentRowIndex inComponent:0 animated:NO]; 

này hoạt động như mong đợi, nhưng có một tác dụng phụ mà nó tạo ra một đĩa đơn "click" âm thanh như nếu người dùng đã cuộn điều khiển. Âm thanh nhấp chỉ xảy ra khi chạy trên thiết bị (không phải trình mô phỏng) và chỉ khi thiết bị đã cài đặt iOS 3.x (tôi đã thử nghiệm với 3.1.3 và 3.2). Đây rõ ràng là lỗi trong iOS đã được khắc phục bắt đầu với iOS 4.0. Nhưng nếu bạn cần nhắm mục tiêu đến Gen1 iPhone, bạn đang mắc kẹt với iOS 3.1.3, nơi có vấn đề này.

Tôi đã thảo luận vấn đề với Apple DTS, nhưng họ không thể đề xuất bất kỳ giải pháp nào khác ngoài nâng cấp lên 4.0. Tôi hỏi nếu họ sẽ làm cho một ngoại lệ và cho phép sử dụng các setSoundsEnabled không có giấy tờ nêu trên (mà thực sự giải quyết vấn đề). Câu trả lời là, "Không có ngoại lệ."

Sau một số công việc thám tử bổ sung, tôi phát hiện ra rằng bạn có thể ngăn chặn âm thanh xảy ra bằng cách tạm thời xóa UIPickerView khỏi superview, gọi selectRow, sau đó thêm lại vào superview.Ví dụ: trong chế độ xemDidLoad:

UIView *superview = [myPicker superview]; 
[myPicker removeFromSuperview]; 

[myPicker reloadAllComponents]; 
[myPicker selectRow:currentRowIndex inComponent:0 animated:NO]; 

[superview addSubview:myPicker]; 

Điều này loại bỏ âm thanh nhấp không liên quan mà không sử dụng các API không có giấy tờ/riêng nên bạn phải vượt qua quy trình phê duyệt của Apple.

+0

đó là một số thao tác thông minh cho chắc chắn! – infiniteloop

+0

Câu trả lời hay! Tôi đã cố gắng tìm ra điều này trong một thời gian dài. – adamsiton

+0

Công trình này tuyệt vời, ngoại trừ việc bạn không thể tạo hiệu ứng cho các bánh xe. Tôi đã thử điều này với hoạt ảnh được kích hoạt, nhưng việc thay đổi hệ thống phân cấp chế độ xem sẽ giết chết hoạt ảnh. – bugloaf

1

Có người tôi biết nói rằng anh lừa bóng qua này App Store xem xét chỉ tuần trước:

// Hide private API call from Apple static analyzer 
SEL sse = NSSelectorFromString([NSString stringWithFormat:@"%@%@%@", @"set",@"Sounds",@"Enabled:"]); 
if ([UIPickerView instancesRespondToSelector:sse]) { 
    IMP sseimp = [UIPickerView instanceMethodForSelector:sse]; 
    sseimp(self.thePicker, sse, NO); 
} 
+0

Ví dụ của bạn được viết theo một cách rất an toàn trong tương lai, nhưng tôi không chắc chắn rằng mã obfuscating để có được xung quanh kiểm tra của Apple là một ý tưởng tốt. Tôi lo lắng rằng hình phạt cho một nỗ lực cố ý để phá vỡ kiểm tra API của họ có thể khắc nghiệt. –

1

Có thể làm việc lừa này? Có người đã có thể ngăn chặn các hiệu ứng âm thanh màn trập máy ảnh bằng cách chơi một bản sao ngược của âm thanh cùng một lúc: https://stackoverflow.com/a/23758876/214070

0

tôi tìm thấy giải pháp quickie nhỏ cho điều này thử dưới đây

 UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, yPickerView, VIEW_WIDTH, PICKERVIEW_HEIGHT)]; 
     pickerView.delegate = self; 
     pickerView.dataSource = self; 
     pickerView.showsSelectionIndicator = YES; 
     pickerView.alpha = 0.8f; 
     pickerView.tag = fieldTag; 
     [pickerView selectRow:pickerViewSelectedIndex inComponent:0 animated:NO]; 

thiết lập hoạt hình: NO cho selectRow: phương pháp

1

Có lẽ đây không phải là câu trả lời cho câu hỏi cụ thể này, nhưng tôi đã có một vấn đề tương tự - đặt minimumDate cho datePicker, và tôi muốn đặt nó mà không gây phiền nhiễu "click". Sau một thời gian tìm thấy giải pháp rất đơn giản:

datePickerCustomTime.minimumDate = [[NSDate date] dateByAddingTimeInterval:300]// min time to set = now + 5 min 
    [datePickerCustomTime setDate:[[NSDate date] dateByAddingTimeInterval:300] animated:NO]; 
+0

Đây là mã chính xác: 'NSDate * minimumDate = [[Ngày NSDate] dateByAddingTimeInterval: 300]; if ([datePickerCustomTime.date laterDate: minimumDate] == minimumDate) {[datePickerCustomTime setDate: minimumDate hoạt ảnh: NO]; } datePickerCustomTime.minimumDate = minimumDate; ' – hlfcoding

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