2 điểm bởi GN⁺ 2025-09-03 | 1 bình luận | Chia sẻ qua WhatsApp
  • Cách chọn thời gian trong ứng dụng Báo thức trên iPhone không phải là thiết kế hình tròn
  • Nhìn bề ngoài có vẻ như giao diện kiểu bánh xe xoay, nhưng thực chất được tạo thành từ một danh sách dài
  • Khiến người dùng có cảm giác đang cuộn theo cách như thể không có điểm kết thúc
  • Được các nhà phát triển và nhà thiết kế UX chú ý như một ví dụ về hiệu ứng đánh lừa thị giác trong UI
  • Việc hiểu cách triển khai thực tế này là tài liệu tham khảo hữu ích cho phát triển ứng dụng

Cấu trúc bộ chọn thời gian trong ứng dụng Báo thức trên iPhone

  • Bộ chọn để cài đặt thời gian trong ứng dụng Báo thức trên iPhone nhìn bề ngoài giống như dạng tròn (bánh xe xoay)
  • Nhưng trên thực tế, bộ chọn này được triển khai dưới dạng một danh sách rất dài có điểm bắt đầu và điểm kết thúc xác định
  • Khi người dùng cuộn, nó tạo cảm giác như có thể tiếp tục xoay lên hoặc xuống mãi mãi
  • Cách triển khai này là một thiết kế nhằm mang lại trải nghiệm người dùng tương tự mà không cần áp dụng trực tiếp giao diện hình tròn
  • Nhà phát triển đã thiết kế giao diện người dùng để trông như hình tròn bằng cách tận dụng danh sách cuộn vô hạn

Góc nhìn của nhà phát triển và thiết kế UX

  • Với cách này, có thể thay thế giao diện hình tròn phức tạp chỉ bằng một danh sách đơn giản
  • Trên thực tế, ở hai đầu danh sách, nó không di chuyển sang hướng ngược lại, chỉ là số lượng mục trong danh sách rất nhiều nên người dùng khó chạm đến giới hạn
  • Thiết kế này sử dụng hiệu ứng đánh lừa thị giác trong UI để mang lại trải nghiệm mà người dùng mong đợi
  • Đây là một ví dụ cho thấy khi phát triển ứng dụng, chỉ cần triển khai danh sách cũng có thể đảm bảo hiệu quả và tính dễ dùng tương tự giao diện hình tròn

Kết luận

  • Bộ chọn thời gian trong ứng dụng Báo thức trên iPhone tạo ra hiệu ứng hình tròn bằng cách xoay một danh sách dài
  • Điều này gợi ra một hướng thiết kế giao diện trực quan nhưng hiệu quả cho các nhà phát triển và nhà thiết kế UI/UX

1 bình luận

 
GN⁺ 2025-09-03
Ý kiến trên Hacker News
  • Lỗi thực sự khó chịu (hoặc không biết có phải là tính năng không) trong ứng dụng Báo thức là phải đợi bánh xe chọn giờ nảy lên rồi dừng hẳn thì cài đặt AM/PM mới được áp dụng đúng. Nếu chỉ vuốt rồi nhấn lưu thì thiết lập trước đó vẫn giữ nguyên, dẫn đến việc báo thức quan trọng lúc 7am vẫn bị giữ thành 7pm và bạn đi làm muộn
    • Dạo này có cảm giác đến cả menu cũng không code cho tử tế nổi. Ví dụ, ở màn hình danh sách chính của ứng dụng Reminders trên macOS, khi chọn menu thả xuống thời gian, nếu thả nút chuột ngay trên thời gian mong muốn rồi hơi di chuyển con trỏ lên xuống trong lúc hiệu ứng nháy đang chạy thì đột nhiên một thời gian khác lại được chọn. Hoàn toàn không khớp với cách hành xử vốn luôn nhất quán trên macOS từ năm 1984. Tôi đã báo lỗi từ vài năm trước, nhưng chắc họ còn nhiều việc được ưu tiên hơn
    • Sau vài lần khổ sở vì lỗi này, cuối cùng tôi đã chuyển hoàn toàn sang định dạng 24 giờ trên mọi thiết bị. Với một giao diện dùng hằng ngày, UI bánh xe cuộn dọc của iOS thật sự rất tệ cả về khả năng sử dụng lẫn thẩm mỹ. Dù vậy, thật may là họ đã thêm tính năng chạm vào giữa bánh xe để hiện bàn phím số. Cách nhập giờ bằng bàn phím số được thiết kế rất tốt và hiệu quả
    • Tôi cứ tưởng chỉ mình tôi bị vậy, hóa ra không phải. Thực tế là Apple đã không thể làm cho ra hồn nổi một cái báo thức suốt từng ấy thời gian
    • Đây là vấn đề lớn nhất tôi gặp phải sau khi chuyển từ Android sang iPhone. Nhưng điều khiến tôi bực hơn là khi kể chuyện này với các developer hay programmer, họ luôn gạt đi kiểu "có phải bạn dùng sai không", "có gì mà quan trọng thế". (Quan trọng chứ, tôi cũng không muốn ngủ quên, nên mới có mấy cuộc trò chuyện này!) Chúng ta nhận lương hơn 100 nghìn USD mà còn không sửa nổi nhanh những thứ nhỏ nhặt thế này thì thật bức bối. Mong mọi người có chút tự hào nghề nghiệp và mạnh dạn sửa các lỗi đơn giản. Trong khi đó UX trên đời này vẫn ngày càng phức tạp hơn. Miệng hô hào đơn giản nhưng UI báo thức và hẹn giờ lại khác nhau, chỉ giống nhau về mặt hình ảnh; hoặc các sự kiện lịch trùng lặp lẽ ra chỉ cần một dòng regex là xóa được mà vẫn cứ lộ nguyên; hay không tìm ra liên hệ trùng tên nên quy trình gộp thủ công bị giấu kỹ, đến lúc gộp khó khăn xong thì lại phát sinh thêm một sự kiện sinh nhật còn không xóa được, v.v. (Đều là trải nghiệm thật của tôi.) Tôi nghĩ tất cả chúng ta đang làm phần mềm ngày càng tệ hơn. AI không cướp việc vì tăng năng suất, mà vì chúng ta đã hạ tiêu chuẩn chất lượng xuống quá thấp. Giờ chỉ cần không còn code bằng Perl hay Brainfuck thôi cũng đã thấy đáng kinh ngạc rồi
    • Đó là lý do mới có tính năng báo thức ngủ/thức dậy. UI của tính năng này thực sự ổn. Bạn có thể đặt lịch theo tuần, và khi chỉnh giờ báo thức, UI đồng hồ tròn còn cho thấy trực quan bạn sẽ ngủ thêm được bao lâu
  • Ngay cả 10 năm trước, một ứng dụng báo thức tốt trên smartphone đã trông như thế này: xem UI đồng hồ báo thức Nokia N9. Và cũng có bài thảo luận trên Hacker News về nó
    • Ứng dụng Google Clock cũng cung cấp tính năng tương tự. Màn hình chính có thanh trượt, bộ chọn giờ hình tròn (cá nhân tôi không thích lắm), và thông báo toast cho biết còn bao lâu nữa báo thức sẽ kêu. Chỉ thiếu tùy chọn mỗi ngày/tắt
    • Ứng dụng đồng hồ trên Android khá ổn và trông giống ứng dụng báo thức Nokia N9. Đầu năm nay tôi chuyển sang iPhone nhưng rất khó chịu vì nhiều vấn đề UI khác nhau. Tôi ngán tận cổ cái bánh xe quay chậm, và rất nhớ thông báo xác nhận kiểu "còn x giờ nữa đến báo thức" như Android cung cấp sau khi đặt báo thức. Đặc biệt bộ chọn số thực sự rất tệ. Mỗi lần phải đặt tuổi trẻ em trong ứng dụng Hilton là tôi lại stress vì phải quay bánh xe số. Tôi không hiểu vì sao iOS lại có danh tiếng là kỳ diệu, vui vẻ và trực quan. Giờ tôi chỉ muốn quay lại Pixel
    • Thú vị là màn hình thiết lập lịch ngủ đi vào qua ứng dụng Health trên iOS lại trông rất giống đồng hồ báo thức Nokia N9
    • Một chiếc smartphone tử tế là điều quan trọng. Thật đáng tiếc khi Nokia lại từ bỏ cuộc chơi ngay sau khi làm ra sản phẩm tốt nhất của mình
    • Dạo này có nhiều người trẻ không biết đọc kim đồng hồ, nên nếu nhắm tới số đông thì tôi nghĩ cũng phải tính đến điều đó
  • Ít nhất thì phút/giây nên được đặt bằng danh sách ngắn để có thể nhanh chóng về 00 trong một lần. Trong ứng dụng BigClock trên PalmOS, chạm vào phần trên của mỗi chữ số thì tăng 1, chạm vào phần dưới thì giảm 1, nhờ vậy việc nhập liệu rất nhanh và có thể đoán trước. Không cần phản hồi hình ảnh kiểu nảy của bánh xe cuộn mà vẫn dễ chọn đúng thời gian mong muốn. Giới thiệu BigClock 1, Giới thiệu BigClock 2
    • Chỉ cần có bàn phím thôi là được (bàn phím số ảo hay bàn phím vật lý đều được). Tối đa bốn lần nhập là xong
  • Ứng dụng Clock trên iOS thật sự dở. Giờ iOS 26 có AlarmKit nên tôi rất vui vì cuối cùng cũng có thể làm ứng dụng báo thức tùy chỉnh của riêng mình. Những tính năng quá hiển nhiên như "giữ báo thức lặp lại nhưng chỉ tắt tạm cho ngày mai" trước đây lại không có, cũng không có kiểu báo thức liên kết với lịch
    • Nếu dùng tính năng ngủ thì bạn đã có thể dùng chức năng kiểu "chỉ tắt cho ngày mai" này từ nhiều năm trước thay vì báo thức thường. Khi đổi lịch ngủ, hệ thống sẽ hỏi bạn muốn đổi toàn bộ lịch hay chỉ tắt một lần
    • Việc Apple mở quyền làm ứng dụng báo thức trực tiếp khiến tôi thấy như một lỗ hổng bảo mật lớn
    • Nếu dùng lịch ngủ, bạn có thể bỏ qua chỉ báo thức tiếp theo, hoặc hỗ trợ giờ thức dậy khác nhau theo từng ngày trong tuần. Có thể cài ngay cùng chỗ với báo thức thường
    • Tôi không thấy nó tệ lắm, ngược lại còn đơn giản nên với vai trò ứng dụng mặc định thì khá dễ hiểu
  • Tôi tự hỏi liệu đoạn code này sau khi viết xong có thật sự không bao giờ được nhìn lại nữa, hay nó sống sót qua cả những lần rewrite mã. iPhone đời cũ từng nổi tiếng xấu vì báo thức lỗi múi giờ hoặc không kêu đúng khi đổi giờ mùa hè Lỗi báo thức iPhone – vấn đề múi giờ/giờ mùa hè
    • Cái này tách biệt với múi giờ hay ứng dụng Clock. Tôi nghĩ giới hạn này phát sinh từ UIPickerView, một component UI ở cấp hệ thống. Ứng dụng của tôi cũng có một "lỗi" tương tự
    • Tôi nghĩ đây là kết quả của quá trình lớn lên tự nhiên. Ban đầu chắc là một danh sách A-Z, nhưng rồi ai đó muốn biến nó thành kiểu quay tròn, và ở tầng UI thì cách đơn giản nhất là lặp lại nhiều lần một danh sách hữu hạn, nên cách này cứ thế được giữ lại. Ví dụ, danh sách hữu hạn trong HTML thì làm rất dễ, nhưng danh sách vô hạn ảo hóa bằng JS có lẽ sẽ phải port lại mỗi lần đổi framework (ví dụ chuyển sang SwiftUI)
    • Vì việc tạo ra một danh sách tròn, vô hạn bằng cách tái sử dụng lặp lại một vài component giống hệt nhau là quá khó, nên kiểu code trực diện tàn bạo như (0..60).times(50).flatten() giải quyết được 99% vấn đề với 1% công sức. Nếu QA chỉ gặp lỗi khi cuộn đến tận cuối danh sách thì chắc Product mới mang nó lên thành issue. Ai mà quan tâm chứ
  • Đây là một cách hack tuyệt vời để tránh phải phát triển widget tùy chỉnh. Xin gửi tràng pháo tay đến anh kỹ sư ngẫu nhiên nào đó
  • Cách này đã bị che giấu hơn 10 năm rồi. Có lẽ cũng đáng suy nghĩ về một giải pháp thực chất
    • Tôi nghĩ chủ nghĩa thực dụng tốt hơn chủ nghĩa hoàn hảo
  • Một điều tôi thấy thú vị là timer và alarm lại có hai implementation tách biệt xa nhau. Ở alarm thì phút quay vòng, còn ở timer thì không. Tôi không hiểu vì sao giao diện tương tự mà lại được implement khác nhau. Cũng chẳng phải là hình tròn gì cả. Theo tôi đó là phần code chỉ làm tăng độ phức tạp một cách không cần thiết
  • Thấy nhiều người trong phần bình luận này than phiền đã quá mệt mỏi với lỗi báo thức iOS, nên tôi để lại một mẹo cho ai cùng cảnh ngộ. Sharp bán nhiều mẫu đồng hồ báo thức rẻ mà ổn. Chỉ với 5~12 USD là bạn có thể được giải thoát vĩnh viễn khỏi những lỗi kiểu này. Thêm nữa, ưu điểm lớn nhất là thiết bị đầu tiên bạn chạm vào buổi sáng không còn là chiếc smartphone đang làm hỏng bộ não nữa. Cá nhân tôi dùng mẫu Sharp Twin Bell mua ở Walmart, loại đắt nhất mà cũng chỉ 12.63 USD
    • Tôi cũng dùng đúng mẫu đó. Điểm hay nhất mà tôi chưa từng có ở đồng hồ báo thức số ngày xưa là mỗi tối phải tự tay đặt lại báo thức. Nó chỉ có công tắc bật/tắt báo thức, và khi chuông đã reo thì bạn phải tắt nó đi, rồi ít nhất 12 tiếng sau mới bật lại được (nếu không thì có thể nó sẽ reo lúc 8 giờ tối). Thế là tối nào tôi cũng thành thói quen kiểm tra lịch rồi bật công tắc báo thức, nên giờ không còn lo quên đặt báo thức cho ngày nghỉ hay những hôm phải dậy sớm nữa. Và vì nó kêu thật sự rất to nên tôi chưa bao giờ nghe thấy chuông xong lại ngủ tiếp
  • Tôi hoàn toàn không hiểu vì sao ở báo thức và hẹn giờ, vị trí nút snooze và stop lại ngược nhau. Có cái thì nút stop ở giữa màn hình, có cái lại ở dưới cùng. Không hiểu sao những thứ như vậy lại không được chuẩn hóa
    • Khi còn ngái ngủ vào buổi sáng và lần mò điện thoại, tôi rất dễ bấm vào nút snooze màu cam to sáng ở vị trí quen thuộc. Muốn thực sự tỉnh hẳn để tắt báo thức thì phải bấm nút stop màu xám đã đổi vị trí, và chỉ lúc đó chuông mới dừng. Nếu tắt snooze trong cài đặt báo thức thì bạn có thể dùng nút stop màu cam to ở giữa giống như timer. Nhưng nghe nói vì thiết kế này quá trực quan nên trong iOS 26 nó sẽ bị bỏ đi vì hai nút trông khác nhau. Thật đáng tiếc khi điều quan trọng nhất với báo thức giờ lại là trông cho đẹp
    • Anh em ơi, tôi thật sự muốn nói lời cảm ơn. Tôi đã khổ sở suốt nhiều năm chỉ vì thiếu những chi tiết nhỏ nhặt như thế này