2011-12-09 18 views
29

Khi nào thì số điện thoại bounds.origin của UIView không phải là (0, 0)?Khi nào một giới hạn của UIView.origin không phải là (0, 0)?

This post là hữu ích cho tôi:

QUAN TRỌNG !! Giới hạn X và Y, nguồn gốc, là để di chuyển bên trong Chế độ xem . Đối với pleple X + 5, di chuyển 5pix sang bên trái của xuất xứ của khung có nghĩa là vẽ tất cả nội dung trong Chế độ xem này sang 5pix bên trái của khung hình nguồn gốc. Nó không làm bất cứ điều gì cho chính nó, nó là những gì đang được vẽ trên nó mà bị ảnh hưởng.

Nhưng nó chỉ mô tả trường hợp khi tôi đã đặt giá trị là bounds.origin.
Trong trường hợp nào khác giá trị của bounds.origin != (0, 0)?

+1

Google đã ẩn mà bài đối với một số lý do không giải thích được - chúng tôi không còn được phép truy cập vào nó (tôi nhận được đưa đến một trang đăng nhập, chuyển hướng buộc từ Google.com) – Adam

Trả lời

0

(sửa một lần nữa vì tôi không thể xóa câu trả lời ban đầu của tôi sau khi nó đã được chấp nhận tín dụng cho điều này đi vào ian, đã đăng một câu trả lời thấu đáo hơn dưới đây :)

Trong hầu hết các trường hợp này sẽ không xảy ra. Nếu bạn khởi tạo chế độ xem của mình với chiều rộng và/hoặc chiều cao phủ định, bạn sẽ nhận được nguồn gốc với X âm của chiều rộng và/hoặc Y âm của chiều cao.

+2

Tôi không nghĩ điều này là đúng . Tôi đã thấy những trường hợp mà một cái gì đó trong hệ thống liên quan đến autoresizing dường như để lại cho tôi với một giới hạn nơi nguồn gốc không phải là 0,0. Trong mã của riêng tôi, tôi chưa bao giờ, bao giờ thiết lập giới hạn để có nó đột nhiên trình bày một số không khác là một cú sốc. –

+0

@KendallHelmstetterGelner Đồng ý. Điều này xảy ra với tôi khi tôi có một bộ điều khiển điều hướng làm một số thay đổi kích thước của UIScrollView của tôi (tôi nghĩ là kết quả của việc điều chỉnh "Điều chỉnh Scroll View Insets" thiết lập). – eremzeit

15

Bounds.origin sẽ là số âm nếu bạn khởi tạo chế độ xem có chiều rộng/chiều cao âm. Ví dụ, nếu bạn đã làm

UIView* v = [[UIView alloc] initWithFrame:CGRectMake(5, 5, -10, -20)]; 

khung sẽ là:

origin = { 
    x = -5, 
    y = -15 
}, 
size = { 
    width = 10, 
    height = 20 
} 

vọt:

origin = { 
    x = -10, 
    y = -20 
}, 
size = { 
    width = 10, 
    height = 20 
} 

trung tâm:

x = 0, 
y = -5 

thử nó cho chính mình!

+0

Điều đó không có ý nghĩa. Nó tương đương với biểu thức "Nguồn gốc của hệ tọa độ tương ứng với chính nó không bằng <0,0>" là sai và không có ý nghĩa. – folex

+1

Tại sao bạn muốn tạo chiều rộng và chiều cao phủ định? – Boon

+2

Có ý nghĩa hay không, đó là kết quả bạn nhận được nếu bạn thực thi mã này. –

21

Giới hạn của UIScrollView sẽ không là (0, 0) khi contentOffset của nó không phải là (0, 0).

19

Khung của khung xem xác định vị trí của nó trong superview. Giới hạn của lượt xem xác định các vị trí đánh giá phụ của chúng tôi. Điều đó có nghĩa là, nếu bạn thay đổi giới hạn của khung nhìn, vị trí của nó sẽ không bị thay đổi, nhưng tất cả vị trí phụ đề của nó sẽ bị thay đổi.

Chiều rộng và chiều cao dương giống như bạn vẽ chế độ xem từ trên trái sang dưới cùng bên phải, trong khi giá trị âm từ dưới cùng bên phải sang phía trên bên trái. Vì vậy,

frame1 = CGRectMake(100, 100, -50, -50) 

là hoàn toàn giống hệt với

frame2 = CGRectMake(50, 50, 50, 50). 

Và trên thực tế, nếu bạn init một cái nhìn với frame 1, nó sẽ tự động thay đổi để Frame2.

Nhưng bounds.origin lượt xem không giống nhau.Bounds.origin cho biết điểm mà bạn "vẽ" chế độ xem, vì vậy tất cả các khung hình phụ sẽ bắt nguồn tại thời điểm này.

Ví dụ, trong Cảnh iPhone 6, ta có:

UIView *leftView = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 275, 275)]; 
leftView.backgroundColor = [UIColor greenColor]; 
[self.view addSubview:leftView]; 

UIView *rightView = [[UIView alloc] initWithFrame:CGRectMake(667-50, 375-50, -275, -275)]; 
rightView.backgroundColor = [UIColor blueColor]; 
[self.view addSubview:rightView]; 

Và chúng tôi đã nhận:

enter image description here

Chúng tôi sẽ thấy rằng khung rightView được tự động thay đổi giá trị tích cực, đó là (342, 50, 275, 275), nhưng bounts.origin = (-275,-275) của nó.

Và chúng ta thêm subviews:

UIView *leftSubview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
leftSubview.backgroundColor = [UIColor grayColor]; 
[leftView addSubview:leftSubview]; 
UIView *rightSubview= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; 
rightSubview.backgroundColor = [UIColor grayColor]; 
[rightView addSubview:rightSubview]; 

enter image description here

Vì vậy, các giới hạn làm cho subview rightView của sau nguồn gốc mà chúng tôi init rightView.

Nếu chúng tôi thay đổi giới hạn của rightView bằng leftView: rightView.bounds = leftView.bounds; Sau đó, hai vị trí subViews giống nhau, chúng tôi đã mất thông tin rằng chiều rộng và chiều cao của rightView là số âm.

enter image description here

Và chúng ta thay đổi giới hạn của leftView thay vì rightView: CGRect vọt = leftView.bounds; bounds.origin = CGPointMake (50, 50); leftView.bounds = bounds;

enter image description here

Chúng ta có thể thấy, frame.origin subview nó được bù đắp bởi bounds.origin (sử dụng trừ đi, không cộng).

Để kết luận:

  1. view.bounds xác định tất cả các vị trí của nó subview của (bù đắp bởi bounds.origin), trong khi bounds sẽ không ảnh hưởng đến vị trí riêng của mình trong SuperView của nó.

  2. Nếu bạn bắt đầu chế độ xem có chiều rộng và chiều cao âm, nó sẽ tự động được chuyển thành tích cực (không thay đổi vị trí), nhưng bounds.origin cho biết điểm bạn bắt đầu "vẽ" chế độ xem.

+0

Câu trả lời hay. "giới hạn" là khó hiểu bởi vì nó cho ấn tượng rằng x, y là vị trí của khung nhìn mà tập hợp của nó. Tại sao họ gắn các kích thước của một cái nhìn với nguồn gốc địa phương của nó? –

+0

Câu trả lời hay, cảm ơn bạn đã dành thêm thời gian để giải thích mọi thứ cùng với các biểu diễn hình ảnh. +1. –

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