Tôi đang sử dụng chế độ xoay, chụm và xoay UIGestureRecognizers để cho phép người dùng đặt một số phần tử giao diện người dùng chính xác vào nơi họ muốn. Sử dụng mã từ đây http://www.raywenderlich.com/6567/uigesturerecognizer-tutorial-in-ios-5-pinches-pans-and-more (hoặc mã tương tự từ đây http://mobile.tutsplus.com/tutorials/iphone/uigesturerecognizer/) cả hai đều cung cấp cho tôi những gì tôi cần để người dùng đặt các phần tử giao diện người dùng này theo ý muốn của họ.Đang tải chuyển đổi & trung tâm của UIView từ các cài đặt cho vị trí khác nhau
Khi thoát người dùng "bố trí giao diện người dùng" chế độ, tôi tiết kiệm của biến đổi và trung tâm như vậy UIView:
NSString *transformString = NSStringFromCGAffineTransform(self.transform);
[[NSUserDefaults standardUserDefaults] setObject:transformString forKey:@"UItransform", suffix]];
NSString *centerString = NSStringFromCGPoint(self.center);
[[NSUserDefaults standardUserDefaults] setObject:centerString forKey:@"UIcenter"];
Khi tôi tải lại ứng dụng, tôi đọc của biến đổi và trung tâm như vậy UIView:
NSString *centerString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIcenter"];
if(centerString != nil)
self.center = CGPointFromString(centerString);
NSString *transformString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UItransform"];
if(transformString != nil)
self.transform = CGAffineTransformFromString(transformString);
Và UIView kết thúc xoay và chia tỷ lệ chính xác, nhưng ở sai vị trí. Hơn nữa, khi chuyển sang chế độ "Bố cục giao diện người dùng" một lần nữa, tôi không thể luôn luôn lấy chế độ xem bằng các cử chỉ khác nhau (như thể chế độ xem được hiển thị không phải là chế độ xem được hiểu bởi trình nhận dạng cử chỉ?)
Tôi cũng có nút đặt lại thiết lập số transform
của UIView thành danh tính và center
của bất kỳ thứ gì khi tải từ NIB. Nhưng sau khi tải trung tâm UIView thay đổi và chuyển đổi, ngay cả việc đặt lại không hoạt động. Vị trí của UIView là sai.
Suy nghĩ đầu tiên của tôi là vì các ví dụ mã cử chỉ này thay đổi center
, việc quay phải xảy ra xung quanh các trung tâm khác nhau (giả sử một số di chuyển, xoay vòng và quy mô không thể đoán trước). Vì tôi không muốn lưu toàn bộ chuỗi chỉnh sửa (mặc dù điều đó có thể hữu ích nếu tôi muốn có một số tính năng hoàn tác trong chế độ bố cục), tôi đã thay đổi trình xử lý UIPanGestureRecognizer để sử dụng phép biến đổi để di chuyển nó. Một khi tôi nhận được rằng làm việc, tôi figured chỉ cần tiết kiệm biến đổi sẽ giúp tôi có được vị trí hiện tại và định hướng, bất kể trong những thứ thứ gì đã xảy ra. Nhưng không may mắn như vậy. Tôi vẫn nhận được một vị trí lập dị theo cách này.
Vì vậy, tôi đang thua lỗ. Nếu một UIView đã được di chuyển và xoay đến một vị trí mới, làm thế nào tôi có thể lưu vị trí và định hướng đó theo cách mà tôi có thể tải nó sau này và đưa UIView trở lại vị trí cần thiết?
Xin lỗi trước nếu tôi không gắn thẻ quyền này hoặc không đặt chính xác hoặc cam kết một số lỗi ngăn xếp chồng lên nhau khác. Đây là lần đầu tiên tôi đăng ở đây.
EDIT
Tôi đang thử hai đề xuất từ trước đến nay. Tôi nghĩ rằng chúng có hiệu quả giống nhau (một gợi ý tiết kiệm khung và cái kia gợi ý tiết kiệm nguồn gốc, mà tôi nghĩ là frame.origin).
Vì vậy, bây giờ lưu/tải từ mã prefs bao gồm những điều sau đây.
Lưu:
NSString *originString = NSStringFromCGPoint(self.frame.origin);
[[NSUserDefaults standardUserDefaults] setObject:originString forKey:@"UIorigin"];
Load (trước tải transform):
NSString *originString = [[NSUserDefaults standardUserDefaults] objectForKey:@"UIorigin"];
if(originString) {
CGPoint origin = CGPointFromString(originString);
self.frame = CGRectMake(origin.x, origin.y, self.frame.size.width, self.frame.size.height);
}
tôi nhận được như nhau (hoặc tương tự - đó là khó có thể nói) kết quả. Trong thực tế, tôi đã thêm một nút để tải lại các prefs và sau khi chế độ xem được xoay, nút "tải lại" sẽ di chuyển UIView bằng một số lần lặp lại (như khung hoặc biến đổi liên quan đến chính nó - mà tôi chắc chắn là một đầu mối, nhưng tôi không chắc nó là gì).
EDIT # 2
Điều này làm cho tôi tự hỏi về tùy thuộc vào quan điểm của frame
. Từ Apple http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW6 (nhấn mạnh mỏ):
Giá trị trong thuộc tính trung tâm luôn hợp lệ, ngay cả khi các yếu tố chia tỷ lệ hoặc xoay đã được thêm vào chuyển đổi của chế độ xem. Điều này cũng không đúng đối với giá trị trong thuộc tính khung, được coi là không hợp lệ nếu chuyển đổi của chế độ xem không bằng với biến đổi nhận dạng.
EDIT # 3
Được rồi, vì vậy khi tôi đang tải prefs trong, tất cả mọi thứ có vẻ tốt đẹp. Bảng điều khiển của giao diện người dùng là bounds
rect là {{0, 0}, {506, 254}}. Vào cuối phương thức viewDidLoad của VC, mọi thứ vẫn ổn. Nhưng vào thời điểm mọi thứ được hiển thị, bounds
là thứ khác. Ví dụ: {{0, 0}, {488.321, 435.981}} (có vẻ như nó lớn như thế nào trong phạm vi giám sát của nó khi xoay và thu nhỏ). Nếu tôi đặt lại giới hạn cho những gì nó được cho là, nó di chuyển trở lại vào vị trí.
Thật dễ dàng để đặt lại giới hạn cho những gì chúng được cho là có lập trình, nhưng tôi thực sự không chắc chắn khi nào làm điều đó! Tôi đã nghĩ sẽ làm điều đó vào cuối viewDidLoad, nhưng bounds
vẫn chính xác tại thời điểm đó.
EDIT # 4
tôi đã cố gắng chụp self.bounds trong initWithCoder (vì nó đến từ một NIB), và sau đó trong layoutSubviews, đặt self.bounds để mà bắt CGRect. Và nó hoạt động.
Nhưng có vẻ như rất khó khăn và đầy nguy hiểm. Điều này có thể không thực sự là cách đúng để làm điều này. (Có thể không?) Câu trả lời của skram dưới đây có vẻ đơn giản, nhưng không hiệu quả đối với tôi khi ứng dụng tải lại.
Câu hỏi đầu tiên tuyệt vời! Chào mừng bạn đến với SO! – jrturton
Cảm ơn, jrturton :) SO thực sự là một cái gì đó khác. Thực tế là tôi có hai câu trả lời trong vòng vài phút (ngay cả khi tôi chưa thành công) chỉ là ngoạn mục! – sbkp
Có lẽ bạn đang sử dụng kết hợp các phép biến đổi tỷ lệ và xoay để xoay/thu phóng và chỉ di chuyển trung tâm cho chảo? – jrturton